Qt如何使用模态(exec())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt如何使用模态(exec())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)相关的知识,希望对你有一定的参考价值。

如图:点击登录进行模态等待,同时进行用户、密码验证,验证完成后模态对话框消失!
如果先exec()模态之后,就进入阻塞状态,无法进行验证了,求解答!

最好用背景线程处理。
点击登录后,创建等待对话框,给等待对话框传递数据,显示等待对话框。
等待对话框显示后,根据传递的数据进行动作(这个动作最好做成背景线程处理的)。
动作处理完毕后,通知等待对话框动作已经完毕,并返回结果。
等待对话框收到通知后,保存好结果数据,关闭自己。
调用等待对话框的地方,从等待对话框实例中获得结果数据。追问

等待对话框exec()之后就不能进行动作了啊

追答

主程序先show主画面,再exec()。
主画面里出来后,如果按下按钮就show 等待对话框(不用再exec).
等待对话框进行验证,结束后返回主画面验证结果。

追问

哎,算了,这个挺折腾的。。。也许我表达能力太差了!
举个例子吧:
QWidget *widget = new QWidget();
QDialog *dialog = new QDialog(widget );
QLabel *label = new QLabel(widget);

dialog->exec(); // exec()后面阻塞,代码不能执行的
label->setText("aaaa");
//验证 ..........

追答

别用dialog->exec(); 用dialog->show();
一个线程通常只有一个exec,在main.cpp中,除非你有特殊要求,才考虑使用exec的。

参考技术A 答案就是,这个验证必须要在进行模态显示的窗口中进行.

比如你点击了登陆按钮,就把 用户和密码都传递到这个模态窗口中,这个窗口就是那个一直在旋转的那个窗口. 等这个窗口验证完毕就自己退出.不就ok了.

这个窗口我觉得可以用一个背景透明 QWidget 来播放一个gif .追问

传参数好传递,但是模态窗口显示之后,(调用exec()之后,他之后的代码就不能执行了),所以也就不能验证了啊

追答

回答不了...

参考技术B 采用非模态,先show()登录界面,条件满足后关闭登录界面,再显示主界面;主界面也是类似的循环,等待登录界面返回

while (1)

if ( MainInitFinish() )

close();
break;

else

QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
QThread::msleep(100);

qt 模态对话框可以互相调用吗

1、模态对话框
(1)要想使一个对话框成为模态对话框,只需要条用它的exec()函数。
QDialog dialog(this);
dialog.exec();
(2)show()函数建立模态对话框,调用函数setModal(true)函数即可。
QDialog *dialog = new QDialog(this);
dialog->setModel(true);
dialog->show();

总结:setModel()与用exec()函数时的效果是不一样的,调用show()函数后会立刻把控制权交给调用者,程序可以继续往下执行;
而调用exec()函数,只有当对话框关闭时才会有返回值。

2、非模态对话框
(1)要想使一个对话框成为非模态对话框,使用new动态创建。
QDialog *dialog = new QDialog(this);
dialog->show();

setWindowModality()函数,有一个参数设置模态对话框要阻塞的窗口类型,可以是Qt::NonModal(不阻塞任何窗口,几非模态)、
Qt::WindowModel(阻塞它的父窗口和所有的祖先窗口及他们的子窗口)、Qt::ApplicationModel(阻塞整个应用程序的窗口)三者之一,
setModel()函数默认的是Qt::ApplicationModel.
参考技术A 对话框本身就是一个对象比如说QLabel和QWidget,要实现窗口互相调用肯定是可行的

以上是关于Qt如何使用模态(exec())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)的主要内容,如果未能解决你的问题,请参考以下文章

qt 模态对话框可以互相调用吗

QT对话框中show和exec的区别

Qt对话框_模态/非模态

qt 学习梳理

MFC 应用程序中的 Qt DLL - 如何使 QDialog *真正* 模态?

Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt: