Why I get "QTimer can only be used with threads started with QThread" messages if I have no QTimer in my code?

iacopo picture iacopo · Nov 26, 2012 · Viewed 9.6k times · Source

When (and only when) I quit my application, these (and only these) repeated message appear on the command prompt:

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

This is quite strange for me, because I never use QTimer in my code (or QThread). In fact, no errors or crashes happen using the application, so this is not a real problem, actually. This happen in both Windows and Linux OSs.

All my imports:

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

The main function:

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

Perhaps it could be something related to QFileSystemWatcher (used by QFileSystemModel), I guess...maybe it uses some QTimer features.

Answer

Vicent picture Vicent · Nov 29, 2012

I've had similar problems in the past.

The QFileSystemModeldocumentation page says the following:

QFileSystemModel.__init__ (self, QObject parent = None)

The parent argument, if not None, causes self to be owned by Qt instead of PyQt.

Constructs a file system model with the given parent.

If you don't pass a parent argument then the Python garbage collector can delete the object at the wrong time and as a side effect raise the error you mention. My advise is to make sure that your objects have a proper parent. I think it should fix the problem.

PS: I haven't checked the docs for every class you use. Maybe QFileSystemModel is not the only class on which this thing happens.