2.4能够改变的对话框(Shape-Changing Dialogs)

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_OBJECT
public:
    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等以后介绍。 

你可能感兴趣的:(2.4能够改变的对话框(Shape-Changing Dialogs))