简体   繁体   中英

QObject::~QObject: Timers cannot be stopped from another thread

I have this very simple Qt code:

void thread_func()
{
    int a1 = 1;
    const char* a2[] = { "dummy_param" };
    QApplication app(a1, (char**)a2);

    QMessageBox msg(QMessageBox::NoIcon, "MyTitle", "Foo bar Foo bar", QMessageBox::Ok);
    msg.exec();
}

If I call the above function from my main in a std::thread , it brings up the dialog:

int main()
{
    std::thread t(thread_func);
    t.join();
}

...but when I close it, I get the warning message:

QObject::~QObject: Timers cannot be stopped from another thread

I've checked that the thread affinity of both QApplication instance and msg is the same. Calling the thread_func function directly from my main() (without creating a std::thread ) removes that message.

I am using Qt 5.15.1 on Windows 10.

What am I missing here? Thanks

It's not allowed to operate Qt GUI directly outside the main thread(GUI thead). You can emit signals.

The warning message says it all. Use a signal/slot mechanism to accomplish the same thing.

#include <QApplication>
#include <QMessageBox>
#include <QObject>
#include <QThread>
#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(){}
public slots:
    void displayMessageBox()
    {
        QMessageBox msg(QMessageBox::NoIcon, "MyTitle", "Foo bar Foo bar", QMessageBox::Ok);
        msg.exec();
        this->close();
    }
};

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker() {}
    void start() { emit askForMessageBox(); }
signals:
    void askForMessageBox();
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget *widget;
    Worker *worker;
    QThread *thread(nullptr);

    widget = new Widget();
    worker = new Worker();
    thread = new QThread(nullptr);

    QObject::connect(worker, &Worker::askForMessageBox, widget, &Widget::displayMessageBox);
    QObject::connect(thread, &QThread::started, worker, &Worker::start);

    widget->show();
    worker->moveToThread(thread);
    thread->start();

    return a.exec();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM