3.5 使用对话框
这一节将说明如何在Qt中使用对话框——如何创建、初始化以及运行它们,并且对用户交互中的选择做出响应。本节将会使用在第2章中创建的Find、GotoCell和Sort对话框,也会创建一个简单的About 对话框。我们从如图3.12所示的Find对话框开始。由于希望用户能够在Spreadsheet窗口和Find对话框之间进行切换,所以Find对话框必须是非模态(modeless)的。非模态窗口就是运行在应用程序中对于任何其他窗口都独立的窗口。
void MainWindow::find()
{
//创建非模态对话框时,通常会把它的信号连接到能够对用户的交互做出响应的那些槽上。
if (!findDialog) {
findDialog = new FindDialog(this);
connect(findDialog, SIGNAL(findNext(const QString &,
Qt::CaseSensitivity)),
spreadsheet, SLOT(findNext(const QString &,
Qt::CaseSensitivity)));
connect(findDialog, SIGNAL(findPrevious(const QString &,
Qt::CaseSensitivity)),
spreadsheet, SLOT(findPrevious(const QString &,
Qt::CaseSensitivity)));
}
/* Find对话框是一个可以让用户在电子制表软件中搜索文本的窗口。当用户单击Edit->Find时,就会调用find( )槽来弹出Find对话框。
* 这时,就可能出现下列几种情形:
* ●这是用户第一次调用Find对话框。
* ●以前曾经调用过Find对话框,但用户关闭了它。.
* ●以前曾经调用过Find对话框,并且现在它还是可见的。
* 如果Find对话框还不曾存在过,就可以创建它并且把它的findNext()信号和findPrevious()信号与Spreadsheet中相对应的那些槽连接起来。
* 本应该在MainWndow的构造函数中创建这个对话框,但是推迟对话框的创建过程将可以使程序的启动更加快速。
* 还有,如果从来没有使用到这个对话框,那么它就决不会被创建,这样可以既节省时间又节省内存。
* 然后,调用show()、raise()和activateWindow()来确保窗口位于其他窗口之上并且是可见的和激活的。
* 只调用show()就足以让一个隐藏窗口变为可见的、位于最上方并且是激活的,
* 但是也有可能是在Find对话框窗口已经是可见的时候又再次调用了它,在这种情况下,show()调用可能什么也不做,
* 那么就必须调用raise()和activateWindow()让窗口成为顶层窗口和激活状态。
*/
findDialog->show();
findDialog->raise();
findDialog->activateWindow();
}
现在看一下如图3.13所示的Go to Cell对话框。我们希望用户可以弹出、使用和关闭它,但是却不希望让这个窗口能够与应用程序中的其他窗口相互切换。也就是说,GotoCell对话框窗口必须是模态(modal)的。模态窗口就是-个在得到调用可以弹出并可以阻塞应用程序的窗口,从而会从调用发生开始起妨碍其他的任意处理或者交互操作,直到关闭该窗口为止。前面使用的文件对话框和消息框就是模态的。
如果对话框是通过show()调用的,那么它就是非模态对话框[除非此后又调用了setModal(),才会让它变为模态对话框]。但是,如果它是通过exec()调用的,那么该对话框就会是模态对话框。
void MainWindow::goToCell(