目录
1 对话框的不同调用方式
在一个应用程序设计中,为了实现一些特定的功能,必须设计自定义对话框。自定义对话框 的设计一般从 QDialog 继承,并且可以采用 UI 设计器可视化地设计对话框。对话框的调用一般包 括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获 取对话框输入数据等过程。
本节将通过实例samp6_2来详细介绍这些原理。图6-5是实例samp6_2的主窗口,及其设置 表格行列数的对话框。
主窗口采用QTableView和QStandardItemModel、QItemSelectionModel构成一个通用的数据 表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点。
-
设置表格行列数对话框QWDialogSize
该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话 框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。 这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话 框,调用后删除对话框对象可以节约内存。
-
设置表头标题对话框QWDialogHeaders
图6-6是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只 创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取 编辑之后的表头标题。对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时 只是打开己创建的对话框对象。
![](https://img-blog.csdnimg.cn/direct/139af37d67d0494aa3c7f79cbc2ca968.png)
图6-5 实例samp6_2主窗口及其设置表格行列数的对话框
![](https://img-blog.csdnimg.cn/direct/3b2a87d53dc34abfbd80e76cf97468a5.png)
图6-6 设置表格表头标题对话框
这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。 下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除 时,对话框才从内存中删除。
-
单元格定位与文字设置对话框QWDialogLocate
图6-7是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以 对主窗口进行操作,对话框只是浮动在窗口上方。在对话框里可以定位主窗口表格的某个单元格 并设置其文字内容,在主窗口上的表格中单击鼠标时,单元格的行号、列号也会更新在对话框中。 对话框关闭后将自动删除,释放内存。
这种对话框适用于主窗口与对话框需要交互操作的情况,例如用于查找和替换操作的对话框。
![](https://img-blog.csdnimg.cn/direct/0b6a4466ceaf46118c5449063df48bd2.png)
图6-7 浮动于主窗囗上方的对话框,可交互操作
2 对话框QWDialogSize的创建和使用
1 创建对话框QWDialogSize
实例主窗口从QMainWindow继承,主窗口用一个QTableView组件作为界面中心组件,设计 几个Action用于创建主工具栏按钮。主窗口采用QStandardltemModel作为数据模型, QItemSelectionModel作为选择模型 。
在项目主窗口建立后,要创建如图6-5所示的设置表格行列数的对话框,单击Qt Creator的菜 单项"File”-> “New File or Project",选择Qt类别下的“Qt Designer Form Class”,创建可视化设 计的对话框类。在随后出现的向导里,选择窗口模板为Dialog without Buttons,并设置自定义对话 框的类名。
设置创建的对话框类名称为QWDialogSize,系统自动生成qwdialogsize.h、qwdialogsize.cpp 和qwdialogsize.ui3个文件。
QWDialogSize对话框的界面设计在UI设计器里进行,放置界面组件并设置好布局。
2 对话框的调用和返回值
设计QWDialogSize对话框的界面时,在上面放置了两个QPushButton按钮,并分别命名为 btnOK和btncancel,分别是“确定”和“取消”按钮,用于获取对话框运行时用户的选择。那么, 如何获得用户操作的返回值呢?
在信号与槽编辑器里,将btnOK的clicked()信号与 对话框的accept()槽关联,将btnCancel的clicked()信号与 对话框的reject()槽关联即可,如图6-8所示。
![](https://img-blog.csdnimg.cn/direct/eb8c699f8ef4438990bca0fbf6a2fc13.png)
图6-8 对话框设计时“确定”和 “取消”按钮的信号与槽关联
单击“确定”按钮会执行accept()槽(或在代码里调 用accept()槽函数也是一样的),这会关闭对话框(默认情况下,对话框只是被隐藏,并不被删除), 并返回QDialog::Accepted作为exec()函数的返回值。
单击“取消”按钮会执行reject()槽函数,也会关闭对话框,并返回QDialog::Rejected作为exec() 函数的返回值。
完成后的QWDialogSize的类完整定义如下:
class QWDialogSize : public QDialog
{
Q_OBJECT
public:
explicit QWDialogSize(QWidget *parent = 0);
~QWDialogSize();
int rowCount();//获取对话框输入的行数
int columnCount();//获取对话框输入的列数
void setRowColumn(int row, int column); //初始对话框上两个SpinBox的值
private slots:
private:
Ui::QWDialogSize *ui;
};
在QWDialogSize的类定义中定义3个public函数,用于与对话框调用者的数据交互。因为窗体上的组件都是私有成员,外界不能直接访问界面组件,只能通过接口函数访问。
下面是类的接口函数实现代码。在析构函数中弹出一个消息提示对话框,以便观察对话框是何时被删除的。
QWDialogSize::~QWDialogSize()
{
QMessageBox::information(this,"提示","设置表格行列数对话框被删除");
delete ui;
}
int QWDialogSize::rowCount()
{ //用于主窗口调用获得行数的输入值
return ui->spinBoxRow->val