您的位置:首页 > 编程语言 > Qt开发

QT总结第6篇:模式对话框和非模式对话框(exec()/accept())

2013-10-14 17:53 169 查看
    作为一名嵌入式工程师来说,我做的一般都是特别老土的命令行模式的软件,所以,对 对话框的模式和非模式的概念是非常不理解的。之所以会接触到这个概念,是因为我在研究QT的exec()这个货到底是个啥?结果引出了这些概念,写个总结吧。

    本篇,会重点讲述模式对话框,以及exec()的用法,accept()和accepted的概念。

一.非模式对话框

非模式对话框是和同一个程序中其它窗口操作无关的对话框。在字处理软件中查找和替换对话框通常是非模式的来允许同时与应用程序主窗口和对话框进行交互。调用show()来显示非模式对话框。show()立即返回,这样调用代码中的控制流将会继续。在实践中你将会经常调用show()并且在调用show()的函数最后,控制返回主事件循环。

上述是我从其他网站上摘抄的,我感觉写的很好。

非模式对话框,说白了,就像你打开了好几个QQ聊天窗口,每个聊天窗口都是一个非模式对话框,想和谁聊和谁聊,只要点击那个窗口就可以输入聊天信息进行发送了。

二.模式对话框

模式对话框就是阻塞同一应用程序中其它可视窗口的输入的对话框:用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框有它们自己的本地事件循环。用来让用户选择一个文件或者用来设置应用程序参数的对话框通常是模式的。调用exec()来显示模式对话框。当用户关闭这个对话框,exec()将提供一个可用的返回值并且这时流程控制继续从调用exec()的地方进行。通常,我们连接默认按钮,例如“OK”到accept()槽并且把“Cancel”连接到reject()槽,来使对话框关闭并且返回适当的值。另外我们也可以连接done()槽,传递给它AcceptedRejected

还是我从其它网站上摘抄的,我还是感觉写的很好。

非模式对话框,说白了,就像你打开QQ聊天窗口,如果这个窗口是模式对话框,那么完蛋了,你必须要先和这货聊完天,然后关闭这个窗口,你才能继续干其他的事情,否则,你根本无法去操作其他的窗口。

OK,下面举一个简单的例子:

1)创建一个widget的类,此为主窗口界面

2)再创建一个mydialog类,此为子窗口界面

那么,我希望在子窗口界面上做一个按键,一旦按下,子窗口界面消失,进入主窗口中。(QT教程与软件里面的第二章)

1.看下图,其中sender为该“进入主窗口”这个按键,clicked为按下这个按键要发送的信号。muyDialog为当前子类的对象,而accept为当前的槽函数。

连在一起的意思是,按下按键后,发送click的信号,然后accept这个槽函数收到信号,然后执行。accept()的作用是:将当前的窗口隐藏(这样就做到子窗口功能消失这个功能),并且发送accepted信号,也就是设置设置结果代码为Accepted

.


2.在main函数中,写入如下代码:

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    Widget w;

    myDialog my1;      //创建一个指向子窗口的对象

    if(my1.exec() == QDialog::Accepted)

    {

        w.show();

        return a.exec();

    }

    else

    {

        return 0;

    }

}

首先,my1.exec()的意思是:执行模式对话框。按照之前对模式对话框的讲述,my1.exec()的意思就是,显示子窗口,并在这里阻塞住,知道该窗口被关闭之后,才继续往下运行!

正因为在这里阻塞住了,所以才没有显示主窗口,因为w.show()没有被运行!

后面就好理解了,当子窗口的那个按键按下后,发出accepted的信号,if(my1.exec() == QDialog::Accepted)这句话成立,所以子窗口关闭,继续执行到w.show()这句话,然后显示主窗口。

到现在为止,所有的功能都实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息