模态和非模态对话框的使用
模态和非模态对话框的使用
创建对话框分模态和非模态两种
- 模态:对话框运行时主窗口处于“模糊”状态,主窗口不可进行操作, 直到对话框退出。
- 非模态:主窗口和对话框均可操作。
示例
A modal dialog: //一个模态对话框示例
void EditorWindow::countWords()
{
WordCountDialog dialog(this);
dialog.setWordCount(document().wordCount());
dialog.exec();
} //exec()方法是带阻塞的,直到窗口关闭
A modeless dialog: //非模态对话框
void EditorWindow::find()
{
if (!findDialog) {
findDialog = new FindDialog(this);
connect(findDialog, SIGNAL(findNext()), this, SLOT(findNext()));
}
findDialog->show();
findDialog->raise();
findDialog->activateWindow();
}
对话框交互方式
- 非模态交互方式:connect对话框的信号与主窗口的槽
/查找button
void FindTextDialog::on_pushButtonFind_clicked()
{
QString text = ui->lineEdit->text(); //获得要查找的文本
int mode = 1;
emit(FindButtonClicked(text,mode)); //发送信号
}
void MainWindow::FindTextDialogShow()
{
if(NULL == m_pDlgFindText)
{
m_pDlgFindText = new FindTextDialog(this); //创建查找对话框
m_pDlgFindText->setModal(false);
QObject::connect(m_pDlgFindText, &FindTextDialog::FindButtonClicked, this, &MainWindow::FindText);
}
m_pDlgFindText->show();
m_pDlgFindText->raise();
m_pDlgFindText->activateWindow();
}
- 模态对话框交互方式
void ShowKBDialog()
{
CNumKeyInput keyBoardDlg; //一个数字输入对话框
INT32 s32Ret = 0;
INT32 s32Value = 0;
QString strRet = "";
s32Ret = keyBoardDlg.exec(); //阻塞等待键盘关闭
strRet = keyBoardDlg.GetValue(); //获取输入值
if (QDialog::Accepted == s32Ret)
{
//下一步操作
}
}