11

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

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 功能。

4

3 回答 3

10

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

QFileSystemModel文档页面说明如下:

QFileSystemModel.__init__ (self, QObject parent = None)

parent 参数,如果不是 None,将导致 self 由 Qt 而不是 PyQt 拥有。

构造具有给定父级的文件系统模型。

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

PS:我没有检查您使用的每个课程的文档。也许QFileSystemModel不是发生这种事情的唯一班级。

于 2012-11-29T18:38:20.523 回答
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从 then 继承,QObject则不会发生错误:

class MyWidget(QObject):
    def __init__(self, parent):
        super(MyWidget, self).__init__(parent)
        #do stuff
于 2013-03-01T21:44:38.333 回答
0

如果您没有像 QFileSystemModel(self) 这样子类化它,则将 self 传递给它的实例化

于 2019-12-05T08:36:35.320 回答