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

前端 未结 3 1281
没有蜡笔的小新 2021-02-20 17:40

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 wi         

  • 2021-02-20 18:00

    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
    0 讨论(0)
  • 2021-02-20 18:03

    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.

    0 讨论(0)
  • 2021-02-20 18:06

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

    0 讨论(0)