简 述: 写一个自定义和标准对话框的使用;还有关于模态对话框和非模态对话框的区别;以及多个Dialog对象之间,如何传递数据;

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


对话框的生存期:

对话框的生存期是指它从创建到删除的存续区间。


模态对话框:

对话框是以模态Modal)方式显示的,即用QDialog:exec()函数显示。模态显示的对话框不允许鼠标再去单击其他窗口,直到对话框退出。

模态方式显示:必须关闭此对话框才可以返回主窗口操作


非模态对话框:

使用QDialog::show(),则能以非模态Modeless)方式显示对话框。非模态显示的对话框在显示后继续运行主程序,还可以在主窗口上操作,主窗口和非模态对话框之间可以交互控制,典型的例子是文字编辑软件里的“查找/替换”对话框。


运行环境如下:

编程环境: win10 x64 专业版 1803

编程软件: Qt Creator 4.8.2 (Enterprise)Qt 5.9.8

写了一个小的例子,源码见下面,上一个最终的运行效果图:


窗口之间的交互:

这里提供两个思路:

如本例子设计的ExDlgLocateExCustomMainWin之间的交互,均是有着对方对象的指针

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代替实现。