求教:Qt多线程中如何显示QMessageBox?

Ellizzn 2013-02-24 02:15:56
现在的项目中为了保证界面的实时响应,将任务在新线程中执行,但是执行的过程中经常需要显示一些QMessageBox对话框和用户进行交互,经常报告ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel/qwidget.cpp, line 1299,求教我该如何去显示这些QMessageBox对话框?
我有两个对话框,主对话框和测试对话框。项目启动时将打开主对话框,点击主对话框中的按钮将打开测试对话框(模式对话框),点击测试对话框中的按钮将新建一个测试线程去运行测试程序,我在测试线程中需要弹出message对话框的地方向测试对话框去发送一个消息,测试对话框收到消息后将显示这个对话框,然后根据用户的选择,将选择的结果发回给测试线程,我发现测试对话框类能准确收到该消息,但是一到要显示QMessageBox的地方就报告ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel/qwidget.cpp, line 1299。
希望大侠指教一下,问题出在哪里?我该如何去显示这个QMessagBox对话框?

另外,我查了写资料,很多都说窗口widget应该在GUI线程中显示,这个GUI线程指程序的主线程,难道我应该向主窗口发信息,在主对话框中弹出message对话框?那我不是需要在主对话框中很早就new一个测试线程,而测试线程需要的参数只有测试对话框运行后才能确定,参数得如何传递,真要这样,Qt的多线程是不是很不合理?线程应该向打开他的父线程发送消息才对,怎么会向其父线程的父窗口去发送消息??!!
...全文
2021 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ellizzn 2013-02-24
  • 打赏
  • 举报
回复
hi,感谢楼上的热心回复,刚刚解决了这个问题,5L的说的有道理,其实在信号槽中我用了自己定义的一个结构体,而这个结构体没有用qRegisterMetaType注册,所以我用Qt::DirectConnection掩盖了问题的症结所在,后来我查了Qt::DirectConnection不能用于不通线程之间的通讯。我加入了qRegisterMetaType<MSGStructInfo>("MSGStructInfo")语句后问题解决了
乔巴好萌 2013-02-24
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/2806552/qprogressbar-not-showing-progress/2806730#2806730
引用 4 楼 lzwaf 的回复:
引用 3 楼 openXMPP 的回复:QMessagebox只能 用于主线程 非主线程不能直接调用QMessagebox 建议用signal-slot关联 你好,我不太明白你说的signal-slot关联,你能说的具体点吗?万分感谢。 我的测试对话框类中有将信号和槽进行连接connect(testThread,SIGNAL(emitMsgBoxSignal(……
jdwx 2013-02-24
  • 打赏
  • 举报
回复
引用 4 楼 lzwaf 的回复:
引用 3 楼 openXMPP 的回复:QMessagebox只能 用于主线程 非主线程不能直接调用QMessagebox 建议用signal-slot关联 你好,我不太明白你说的signal-slot关联,你能说的具体点吗?万分感谢。 我的测试对话框类中有将信号和槽进行连接connect(testThread,SIGNAL(emitMsgBoxSignal(……
把connect的最后一个参数去掉。
Ellizzn 2013-02-24
  • 打赏
  • 举报
回复
引用 3 楼 openXMPP 的回复:
QMessagebox只能 用于主线程 非主线程不能直接调用QMessagebox 建议用signal-slot关联
你好,我不太明白你说的signal-slot关联,你能说的具体点吗?万分感谢。 我的测试对话框类中有将信号和槽进行连接connect(testThread,SIGNAL(emitMsgBoxSignal(MSGStructInfo)),this,SLOT(receiveMsgBoxSignal(MSGStructInfo)),Qt::DirectConnection)的代码,该测试对话框类中直接调用QMessageBox是没问题的,但是测试对话框类中的槽函数显示对话框时就报错了。
乔巴好萌 2013-02-24
  • 打赏
  • 举报
回复
QMessagebox只能 用于主线程 非主线程不能直接调用QMessagebox 建议用signal-slot关联
Ellizzn 2013-02-24
  • 打赏
  • 举报
回复
用了信号槽啊,在测试线程中发送信号给测试对话框,测试对话框中的槽来显示QMessageBox,弹出QMessageBox时候报错ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel/qwidget.cpp, line 1299。所以不明白问题出在哪?
  • 打赏
  • 举报
回复
为何不用信号槽

21,495

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧