请问一下,Qt Gui主线程中能不能启用一个子线程来显示等待Dialog

polly_polly 2013-03-26 02:44:29
在Gui主界面中点击一个按钮显示另一个界面。

我是这样做的

DialogA中点击按钮Btn->调用DialogB中的Init初始化函数->DialogB显示(show)

问题:

调用Init初始化函数比较耗时。
我现在做了一等待对话框QWaitDlg,

我想请问一下,能不能另起一个QThread来将QWaitDlg显示在DialogA上方

或者还有什么更好的处理方法。

谢谢了,各位专家

...全文
1042 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
polly_polly 2013-03-29
  • 打赏
  • 举报
回复
已经解决了,还是必须得启用新的处理线程,将耗时的操作放到后台线程处理,谢谢各位!
polly_polly 2013-03-27
  • 打赏
  • 举报
回复
引用 4 楼 jdwx1 的回复:
QSplashScreen不是更好吗,被设计为专门用来显示启动画面的。
QSplashScreen我是在程序启动的时候用到的,在显示任何Dialog的时候都可以用吗
polly_polly 2013-03-27
  • 打赏
  • 举报
回复
如果Init函数耗时较长的话,会在当前的界面等好长时间才会切换过去
polly_polly 2013-03-27
  • 打赏
  • 举报
回复
引用 11 楼 openXMPP 的回复:
[quote=引用 10 楼 polly_polly 的回复:] [quote=引用 8 楼 openXMPP 的回复:] 显然可以 windows里有个消息队列对应的有postMessage是异步消息处理 可以处理异步的消息 Qt里面你也可以模拟自己做一个异步消息队列 但是show 和 hide不建议做成异步的
show和hide可以不做成异步的,具体怎么做呢 我现在就在困惑啊,我用了很多方法都不行,发个信号过去初始化也不行,毕竟是在同一个界面线程里。我的意思是不启用新线程能否实现提示用户的效果呢 我目前有异步处理的地方,是这样做的,我自己做了一个waitDlg,在界面上点击某个按钮,我发送消息到处理线程(pthread posix线程),然后启用模态waitDlg(exec),处理线程完成后发个消息回来我关闭删除等待对话框。[/quote] 就用QThread就可以吧,移植性比POSIX pthread好 伪码如下: class myWidget: public QWidget { private: myThread *mWorkThread; } 其中 class myThread: public QThread { } 使用时 mWorkThread->start() 然后重写其run函数 你的所有消息可以自己用QList简答封装下,然后放给mWorkThread处理 mWorkThread处理完成了 myWidget->callEmitFunc();//在callEmitFunc()里emit handle_ok的信号,并通过参数把结果带出来 一般多线程的直接emit 给GUI线程有时有问题[/quote] 你的意思是还是要启用新的处理线程,那如果不启用处理线程可以实现么,你说的我都明白,现在我想用最小的改动实现效果,好像发送异步信号也不行。 我说一下我现在的实现: 我现在有多个Dialog,为了实现切换导航的效果,我是在一开始全部new出来的,保存到主程序一个map容器里,主程序里连接一个信号和槽 connect(this, SIGNAL(gotoDialog(int)), this, SLOT(runningDialog(int))); 提供一个公有的方法(iIndex是各个子对话框的map索引) void MainForm::ShowDialog(int iIndex) { emit gotoDialog(iIndex); } runningDialog里就是根据索引来调用子对话框的Init函数,然后show,隐藏其他的所有Dialog
乔巴好萌 2013-03-27
  • 打赏
  • 举报
回复
引用 10 楼 polly_polly 的回复:
[quote=引用 8 楼 openXMPP 的回复:] 显然可以 windows里有个消息队列对应的有postMessage是异步消息处理 可以处理异步的消息 Qt里面你也可以模拟自己做一个异步消息队列 但是show 和 hide不建议做成异步的
show和hide可以不做成异步的,具体怎么做呢 我现在就在困惑啊,我用了很多方法都不行,发个信号过去初始化也不行,毕竟是在同一个界面线程里。我的意思是不启用新线程能否实现提示用户的效果呢 我目前有异步处理的地方,是这样做的,我自己做了一个waitDlg,在界面上点击某个按钮,我发送消息到处理线程(pthread posix线程),然后启用模态waitDlg(exec),处理线程完成后发个消息回来我关闭删除等待对话框。[/quote] 就用QThread就可以吧,移植性比POSIX pthread好 伪码如下: class myWidget: public QWidget { private: myThread *mWorkThread; } 其中 class myThread: public QThread { } 使用时 mWorkThread->start() 然后重写其run函数 你的所有消息可以自己用QList简答封装下,然后放给mWorkThread处理 mWorkThread处理完成了 myWidget->callEmitFunc();//在callEmitFunc()里emit handle_ok的信号,并通过参数把结果带出来 一般多线程的直接emit 给GUI线程有时有问题
polly_polly 2013-03-27
  • 打赏
  • 举报
回复
引用 8 楼 openXMPP 的回复:
显然可以 windows里有个消息队列对应的有postMessage是异步消息处理 可以处理异步的消息 Qt里面你也可以模拟自己做一个异步消息队列 但是show 和 hide不建议做成异步的
show和hide可以不做成异步的,具体怎么做呢 我现在就在困惑啊,我用了很多方法都不行,发个信号过去初始化也不行,毕竟是在同一个界面线程里。我的意思是不启用新线程能否实现提示用户的效果呢 我目前有异步处理的地方,是这样做的,我自己做了一个waitDlg,在界面上点击某个按钮,我发送消息到处理线程(pthread posix线程),然后启用模态waitDlg(exec),处理线程完成后发个消息回来我关闭删除等待对话框。
乔巴好萌 2013-03-27
  • 打赏
  • 举报
回复
ps 我觉得你如下描述比较好 gui线程发出一个异步请求放至消息队列 非gui线程从消息队列里取出数据处理再通知gui线程更新
乔巴好萌 2013-03-27
  • 打赏
  • 举报
回复
显然可以 windows里有个消息队列对应的有postMessage是异步消息处理 可以处理异步的消息 Qt里面你也可以模拟自己做一个异步消息队列 但是show 和 hide不建议做成异步的
polly_polly 2013-03-27
  • 打赏
  • 举报
回复
引用 2 楼 wggqt 的回复:
你可以在主线程里启动QWaitDlg 然后多线程init比较好 那样就简单多了 QWaitDlg setmodal show就可以 其实不用多线程 setmodal (true) 并不阻塞
请你看一下我上面的一条回复,不用多线程可以实现么 这么说吧,我现在有多个Dialog,为了实现切换导航的效果,我是在一开始全部new出来的, 切换到某一界面的时候,只是调用一下该界面show()方法,然后其他所有界面全部调用hide()隐藏
polly_polly 2013-03-27
  • 打赏
  • 举报
回复
在我的工程里,所有Dialog都是在主程序一启动的时候new出来的,界面切换的时候调用一下初始化函数,然后show, 初始化函数比较耗时,怎么添加相关提示来提示用户正在切换。
jdwx 2013-03-26
  • 打赏
  • 举报
回复
QSplashScreen不是更好吗,被设计为专门用来显示启动画面的。
Red_angelX 2013-03-26
  • 打赏
  • 举报
回复
不要再线程里操作任何UI的东西
qt初体验 2013-03-26
  • 打赏
  • 举报
回复
你可以在主线程里启动QWaitDlg 然后多线程init比较好 那样就简单多了 QWaitDlg setmodal show就可以 其实不用多线程 setmodal (true) 并不阻塞
polly_polly 2013-03-26
  • 打赏
  • 举报
回复
我的意思是在调用Init初始化函数前启动线程显示等待画面,主线程Init函数执行结束后,等待画面线程退出,再显示DialogB

16,211

社区成员

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

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