2.4能够改变的对话框前面几章我们设计的对话框都是不能改变它的样子的。但是有时需要对话框根据要求进行适当的改变。两个最常用的需要改变的对话框是可扩展对话框和多页对话框。这两种类型的可以通过代码编写,也可以用Qt Designer设计。可扩展对话框通常外观简单,带有一个可扩展按钮来切换对话框的简单外观和可扩展外观。这种对话框通常为了迎合普通用户和高端用户而设计的,如果没有特别请求隐藏高级应用部分。在这一节,我们使用Qt Designer设计一个可扩展对话框。
对话框是一个表格程序的排序对话框,对用户选择的一些列按要求排列。对话框的简单外观允许用户输入一个简单排序关键词,扩展部分允许输入两个额外的排序关键词。一个More按钮使用户在简单外观和扩展外观进行切换。我们使用Qt Designer创建这个可扩展的对话框,在运行时刻隐藏高级功能,这个看起来很复杂的对话框用Qt Designer可以很容易实现。首先设计好第一个关键词,第二个和第三个关键词通过复制就可以得到:1、启动File|New菜单,选择“Dialog with Buttons Right”模板。2、创建More按钮,并将它托到右边的垂直布局管理器中,放到垂直空白的下面。设置按钮的文本属为“&More”,它的checkable属性为“true”,设置Ok按钮的default属性为true。3、创建一个组合框,两个标签,两个下拉组合框和一个水平空白,先把它们放在对话框的任何地方。4、把组合框拖动大些,把3中其他控件拖动到其中,按比例调整位置。5、第二个下拉框宽度调整为第一个下拉框的二倍。6、设置组合框的title属性为“&Primary Key”,第一个标签的text属性为“Column:”,第二个标签的text属性为“Order:”。7、设置第一个下拉框的第一个项目文本项为“None”。8、设置第二个下拉框的项目为“Ascending”和“Descending”两个项目,即升序和降序排列。9、选择组合框,设置它的布局为Grid。如果设计过程中出现错误,可以选择Edit|Undo或者Form|Break Layout,重新进行排列。当然只要看起来不是很难看,也可以是其他的样子,只要易于理解就是ok。现在加入第二个,第三个关键词:1、把对话框拖动到足够大。2、复制第一个组合框,粘贴两次,一次拖动到下面。3、把复制的两个组合框的title属性为“&Secondary Key”和“Tertiary Key”。4、在第一个关键词和第二个关键词组合框之间添加一个垂直空白。5、调整添加的控件。6、选择这个对话框,降它设置为Grid管理。7、设置两个垂直空白的sizeHint属性为[20,0]。按照下图命名每一个控件。命名对话框为sortDialog,窗口标题为“Sort”。然后设置控件的tab顺序。从上到下点击下拉框,然后点击Ok,Cancel,More按钮。以上是对话框的设计。然后用Qt Designer建立控件的信号连接。因为我们创建对话框时使用了“Dialog with Buttons Right”模板,Ok和Cancel按钮已经连接到了对话框的accept()和reject()槽函数。连接可以在Qt designer的signal/slot编辑窗口查看。我们需要自己建立的连接是连接More按钮和secondary-GroupBox。将按钮的toggled(bool)信号和组合框的setVisible(bool)连接。选择Edit|Signal/Slots,将编辑状态变为连接态,拖动More按钮到secondary-GroupBox上,弹出信号编辑对话框。创建一个sort目录,保存对话框文件到sort目录的sortdialog.ui,使用多继承的方式使用这个对话框。首先新建一个sortdialog.h头文件,代码如下:#ifndef SORTDIALOG_H#define SORTDIALOG_H#include <QDialog>#include "ui_sortdialog.h"class SortDialog : public QDialog, public Ui::SortDialog{ Q_OBJECTpublic: SortDialog(QWidget *parent = 0); void setColumnRange(QChar first, QChar last);};#endif
然后新建sortdialog.cpp源文件: 1 #include <QtGui> 2 #include "sortdialog.h" 3 SortDialog::SortDialog(QWidget *parent) 4 : QDialog(parent) 5 { 6 setupUi(this); 7 secondaryGroupBox->hide(); 8 tertiaryGroupBox->hide(); 9 layout()->setSizeConstraint(QLayout::SetFixedSize);10 setColumnRange('A', 'Z');11 }12 void SortDialog::setColumnRange(QChar first, QChar last)13 {14 primaryColumnCombo->clear();15 secondaryColumnCombo->clear();16 tertiaryColumnCombo->clear();17 secondaryColumnCombo->addItem(tr("None"));18 tertiaryColumnCombo->addItem(tr("None"));19 primaryColumnCombo->setMinimumSize(20 secondaryColumnCombo->sizeHint());21 QChar ch = first;22 while (ch <= last) {23 primaryColumnCombo->addItem(QString(ch));24 secondaryColumnCombo->addItem(QString(ch));25 tertiaryColumnCombo->addItem(QString(ch));26 ch = ch.unicode() + 1;27 }28 }
在构造函数中,隐藏了第二个和第三个关键词部分。设置对话框的sizeConstraint的属性为QLayout::setFixedSize,这样用户就不能随便改变对话框的大小。下面是main.cpp文件:#include <QApplication>#include "sortdialog.h"int main(int argc, char *argv[]){ QApplication app(argc, argv); SortDialog *dialog = new SortDialog; dialog->setColumnRange('C', 'F'); dialog->show(); return app.exec();}编译运行这个程序,点击More按钮,查看对话框的改变。另一种可以改变的对话框是多页对话框。这类对话框也可以用两种方式创建。相关的类有QTabWidget,QStackedWidget,QListWidget,QTreeWidget等以后介绍。
