简 述: 写一个自定义和标准对话框的使用;还有关于模态对话框和非模态对话框的区别;以及多个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
代替实现。