Почему я получаю "QTimer может использоваться только с потоками, начатыми с сообщений QThread", если у меня нет 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

Это довольно странно для меня, потому что я никогда не использую QTimer в своем коде (или QThread). Фактически, никаких ошибок или сбоев не происходит с помощью приложения, поэтому на самом деле это не настоящая проблема. Это происходит как в ОС 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.

Ответ 1

У меня были аналогичные проблемы в прошлом.

Страница QFileSystemModel сообщает следующее:

QFileSystemModel.__init__ (self, QObject parent = None)

Родительский аргумент, если не None, заставляет себя принадлежать Qt вместо PyQt.

Создает модель файловой системы с данным родителем.

Если вы не передаете аргумент parent, тогда сборщик мусора Python может удалить объект в неподходящее время и в качестве побочного эффекта поднять указанную вами ошибку. Советую убедиться, что у ваших объектов есть правильный родитель. Я думаю, что это должно решить проблему.

PS: Я не проверял документы для каждого используемого вами класса. Может быть, QFileSystemModel - не единственный класс, на котором происходит эта вещь.

Ответ 2

По моему опыту это происходит, когда я подклассифицирую класс 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