为什么我的“QTimer只能用于以QThread开头的线程”消息,如果我的代码中没有QTimer?

时间:2012-11-26 10:04:40

标签: python pyqt4 multiplatform qtimer

当我(并且仅当)退出我的应用程序时,这些(并且只有这些)重复的消息出现在命令提示符上:

QObject::startTimer: QTimer can only be used with threads started with QThread
QObject::startTimer: QTimer can only be used with threads started with QThread
QObject::startTimer: QTimer can only be used with threads started with QThread

这对我来说很奇怪,因为我从不在我的代码(或QThread)中使用QTimer。 事实上,使用该应用程序不会发生任何错误或崩溃,因此实际上这不是一个真正的问题。 这种情况发生在Windows和Linux操作系统中。

我所有的进口商品:

from __future__ import print_function
from PyQt4.QtGui import (QApplication, QMainWindow,
                         QFileSystemModel, QTreeView, QTableView,
                         QAbstractItemView, QMenu, QAction, QKeyEvent)
from PyQt4.QtCore import QDir, Qt, SIGNAL, QString, QFileInfo, QCoreApplication
import sys

主要功能:

def main():
    app = QApplication(sys.argv)
    app.setApplicationName("QFM")
    app.setStyle("plastique")
    gui = MainWindow()
    gui.show()
    app.exec_()

也许它可能与QFileSystemWatcher(由QFileSystemModel使用)相关,我想......也许它使用了一些QTimer功能。

3 个答案:

答案 0 :(得分:10)

过去我遇到过类似的问题。

QFileSystemModel documentation page说明以下内容:

  

QFileSystemModel.__init__ (self, QObject parent = None)

     

父参数(如果不是None)会导致自己被Qt拥有   而不是PyQt。

     

使用给定父级构造文件系统模型。

如果你没有传递parent参数,那么Python垃圾收集器可以在错误的时间删除对象,并且副作用会引发你提到的错误。我的建议是确保你的对象有一个合适的父对象。我认为应该解决这个问题。

PS:我没有检查你使用的每个课程的文档。也许QFileSystemModel并不是这件事发生的唯一阶级。

答案 1 :(得分:3)

根据我的经验,当我将Qt类子类化并且子类的一个成员不是Qt层次结构的一部分时,就会发生这种情况。例如:

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        ...
        self.my_widget = MyWidget()
        ...

如果我以这种方式实现MyWidget,它会在对象被销毁时给我QTimer错误:

class MyWidget(object):
    def __init__(self):
        # do stuff

但是,如果MyWidget继承自QObject,则不会发生错误:

class MyWidget(QObject):
    def __init__(self, parent):
        super(MyWidget, self).__init__(parent)
        #do stuff

答案 2 :(得分:0)

如果不将其子类化,则将self传递给它的实例化 QFileSystemModel(self)