QObject::~QObject: 定时器不能从另一个线程停止

Posted

技术标签:

【中文标题】QObject::~QObject: 定时器不能从另一个线程停止【英文标题】:QObject::~QObject: Timers cannot be stopped from another thread 【发布时间】:2020-09-27 19:36:11 【问题描述】:

我有这个非常简单的 Qt 代码:

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();

如果我在std::thread 中从main 调用上述函数,它会弹出对话框:

int main()

    std::thread t(thread_func);
    t.join();

...但是当我关闭它时,我收到警告消息:

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

我检查了QApplication 实例和msg 的线程亲和性是否相同。直接从我的main() 调用thread_func 函数(不创建std::thread)会删除该消息。

我在 Windows 10 上使用 Qt 5.15.1。

我在这里缺少什么?谢谢

【问题讨论】:

您不能在运行main 的线程之外的任何线程上创建GUI 元素(例如QMessageBox)。它只是不受支持。 @G.M.我认为它可以工作,至少在此处发布的 Windows 上:***.com/questions/22289423/… 【参考方案1】:

不允许在主线程外直接操作Qt GUI(GUI thead)。你可以发出信号。

【讨论】:

【参考方案2】:

警告信息说明了一切。使用信号/槽机制来完成同样的事情。

#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();

【讨论】:

上面提供的示例。

以上是关于QObject::~QObject: 定时器不能从另一个线程停止的主要内容,如果未能解决你的问题,请参考以下文章

Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)

QObject 子类未检测到 QGuiApplication 事件循环

QT定时器的两种应用(QObject就有timerEvent事件,一种什么样的居心呢?)

PyQt:定时器不能从另一个线程启动

QObject 重入和线程安全

访问从另一个 QObject 类继承的 QObject 类