简  述:  写一个自定义和标准对话框的使用;还有关于模态对话框和非模态对话框的区别;以及多个Dialog对象之间,如何传递数据;
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
对话框的生存期:
对话框的生存期是指它从创建到删除的存续区间。
模态对话框:
对话框是以模态(Modal)方式显示的,即用QDialog:exec()函数显示。模态显示的对话框不允许鼠标再去单击其他窗口,直到对话框退出。
模态方式显示:必须关闭此对话框才可以返回主窗口操作
非模态对话框:
使用QDialog::show(),则能以非模态(Modeless)方式显示对话框。非模态显示的对话框在显示后继续运行主程序,还可以在主窗口上操作,主窗口和非模态对话框之间可以交互控制,典型的例子是文字编辑软件里的“查找/替换”对话框。
运行环境如下:
编程环境:  win10 x64 专业版 1803  
编程软件:  Qt Creator 4.8.2 (Enterprise), Qt 5.9.8
写了一个小的例子,源码见下面,上一个最终的运行效果图:
 
窗口之间的交互:
这里提供两个思路:
如本例子设计的ExDlgLocate和ExCustomMainWin之间的交互,均是有着对方对象的指针
在ExDlgLocate类里面函数实现, ExCustomMainWin* parWind = (ExCustomMainWin*)parentWidget():
//设置文字
void ExDlgLocate::on_btnSetText_clicked()
{
    int row = ui->spinBoxRow->value();                                     //定位到单元格,并且设置字符串
    int col = ui->spinBoxCol->value();
    ExCustomMainWin* parWind = (ExCustomMainWin*)parentWidget();           //向具体的item中填写字符串
    parWind->setACellText(row, col, ui->lineEdit->text());
    if (ui->checkBoxRow->isChecked())
        ui->spinBoxRow->setValue(1 + ui->spinBoxRow->value());
    if (ui->checkBoxCol->isChecked())
        ui->spinBoxCol->setValue(1 + ui->spinBoxCol->value());
}同样的, 在ExCustomMainWin类里面,也可以找到
class ExCustomMainWin : public QMainWindow
{
...
private:
    QStandardItemModel *m_model;                        //数据模型
    QItemSelectionModel *m_seleModel;                   //item选择模型
    ExDlgSetHeaders *m_dlgSetHeaders;
    ExDlgLocate *m_dlglocate;
...
};另外一个思路:
利用Qt优秀的信号与槽机制
无需再在ExCustomMainWin类里面,保持ExDlgLocate对话框的指针。而是在ExCustomMainWin和ExDlgLocate的类里面,定义一些信号和槽来使用connect代替实现。


