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

3

12

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.

Lectern answered 26/11, 2012 at 10:4 Comment(7)
Can you point out on which line of your code these messages are caused?Meneses
Absolutely not, this 2 or 3 repeated lines are the unique information that are given to me!!! :-|.Lectern
Try adding some console output to find the causing code line.Meneses
Maybe it comes from a library you use. Try to eliminate parts of your code until the problem goes away. That should give you some clue where the problem lies.Eydie
@user714965: there is no other console output, it's not possible to find the causing code line. JanneKarila: I added my imports. Because the application is still very small, I'm going to go test previous versions to find the moment when the issue started to appear.Lectern
possible duplicate of PyQt4 Results in QThread errorPero
Without a SSCCE this question is basically impossible to evaluate. -1Ledet
E
11

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.

Erleneerlewine answered 29/11, 2012 at 18:38 Comment(1)
I hit the same problem with QCompleter classMisogynist
M
3

In my experience this happens when I subclass a Qt class and one of the members of the subclass is not part of the Qt hierarchy. For example:

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

If I implement MyWidget in this way, it will give me the QTimer error when the object is destroyed:

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

However, if MyWidget inherits from QObject then no error occurs:

class MyWidget(QObject):
    def __init__(self, parent):
        super(MyWidget, self).__init__(parent)
        #do stuff
Meneses answered 1/3, 2013 at 21:44 Comment(0)
I
1

pass in self into the instantiation of it if you are not subclassing it like so QFileSystemModel(self)

Insolate answered 5/12, 2019 at 8:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.