当我(并且仅当)退出我的应用程序时,这些(并且只有这些)重复的消息出现在命令提示符上:
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功能。
答案 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)