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 事件循环