这个对话框是一个用于电子制表软件应用程序的排序对话框(Sort对话框) ,在这个对话框中,用户可以选择一列或多列进行排序。在这个简单外观中,允许用户输人一个单一的排序键,而在扩展外观下,还额外提供了两个排序键。More按钮允许用户在简单外观和扩展外观之间切换。
我们将在Qt设计师中创建这个对话框的扩展外观,并且在运行时根据需要隐藏排序的第二键和第三键。这个窗口部件看起来有些复杂,但在Qt设计师中可以轻而易举地完成它。简单的诀窍是首先完成主键部分,然后再复制并且粘贴两次就可以获得第二键和第三键所需的内容。
1、添加新文件->文件和类中选择Qt->Qt 设计师界面类->Dialog without Buttons->类名“SortDialog”;
2、创建OK按钮并拖放到窗体的右上角。将它的objectName修改成“okButton”,并将它的default属性设置为“true”;
3、创建Cancel按钮并拖放到OK按钮下方。将它的objectName修改成“cancelButton”;
4、创建一个垂直分隔符并拖放到Cancel按钮下方,然后再创建一个More按钮。并将它放在垂直分隔符的下方。将More按钮的objectName修改为“moreButton”,text属性设置为“&More”,checkable属性设置为ture;
5、单击OK按钮,按下Ctrl键再单击Cancel按钮、垂直分隔符和More按钮,然后单击垂直布局。
6、创建一个群组框(GroupBox)、两个标签(QLabel)、两个组合框(Combo Box)以及一个水平分隔符(Horizontal Spacer),然后把它们放到窗体上的任意位置;
7、拖动群组框右下角使它变大一些。然后把其他窗口部件移到群组框中,拖动第二个组合框的右边缘使它的宽度大约为第一个组合框的两倍;
8、将群组框的title属性设置为“&Primary Key”,第一个标签的text属性设置为“Column:”,第二个标签的text属性设置为“Order:”;
9、右键单击第一个组合框,选择编辑项目,添加一个文本项“None”,右键单击第二个组合框,选择编辑项目,添加两个文本项“Ascending”和“Descending”,
10、单击群组框,然后单击栅格布局(快捷键Ctrl+G)。再次点击群组框,单击调整大小(Ctrl+J)。此时将会产生一个如图所示的布局。
如果没能生成你所希望的那种布局效果,或者是不小心做错了,那么总是可以随时先通过单击编辑->Undo(快捷键Ctrl+z)或工具->Form Editor->打破布局,然后再重新放置这些要摆放的窗口部件,最后再试着对它们重新布局,直到满意为止。
现在来添加其他两个群组框:Secondary Key和Tertiary Key:
1、让对话框窗口足够高,以便可以容纳另外两个部分;
2、按下Ctrl键(Mac按下Alt键),然后单击并拖动Primary Key群组框,将第一个群组框的内容再生成两个群组框;
3、将它们的title属性分别修改为“&Secondary Key”和“&Tertiary Key”;
4、创建一个垂直分隔符,放在第一个群组框和第二个群组框之间;
5、将这些窗口部件如下图排列成网格状。单击窗体,取消对任意选中窗口部件的选择,单击栅格布局(Ctrl+G)。
6、把两个垂直分隔符的sizeHint属性设置为[20,0];
最终的网格布局是4行2列,一共有8个单元格。Primary Key群组框、最左边的垂直分隔符、Secondary Key群组框和Tertiary Key群组框各占一个单独的单元格。包含0K、Cancel 和More按钮的垂直布局占用了两个单元格。最后,会在对话框的右下角剩下两个空白单元格。如果你做出来的对话框不是这样,那么请撤销布局,重新放置窗口部件的位置,然后再重新试试。
将窗体标题修改为“Sort”,并按照下图修改各个子窗口部件的名称。
单击编辑->Edit Tab Order,从窗体最上面到最下面依次单击每个组合框,然后单击窗体右侧的OK、Cancel和More按钮。单击编辑->Edit Widgets离开Tab键顺序设置模式。
现在,窗体已经设计完成,可以开始着手设置一些信号-槽的连接来实现窗体的功能了。
单击编辑->Edit Signals/Slots,进入Qt设计师的设置连接模式。窗体中各个窗口部件之间的连接用蓝色箭头表示。
要在两个窗口部件之间建立连接,可以单击作为发射器的窗口部件并且拖动所产生的红色箭头线到作为接收器的窗口部件上,然后松开鼠标按键。这时会弹出一个对话框,可以从中选择建立连接的信号和槽。
要建立的第一个连接位于okButton按钮和窗体的accept()槽之间。把从okButton按钮开始的红色箭头线拖动
到窗体的空白区域,然后松开按键,这样会弹出如下图所示的设置连接对话框。从该对话框中选择clicked()作为信号,选择accept()作为槽,然后单击OK按钮。
对于第二个连接,把从cancelButton按钮开始的红色箭头线拖动到窗体的空白区域,然后在设置连接对话框中连接按钮的clicked( )信号和窗体的reject()槽。
要建立的第三个连接位于moreButton按钮和secondaryGroupBox群组框之间。在这两个窗口部件之间拖动红色箭头线,然后选择toggled(bool)作为信号,选择setVisible(bool)作为槽。 默认情况下,setVisible(bool)槽不会显示在Qt设计师的槽列表中,但如果选中了“显示从QWidget继承的信号和槽”选项,就可以看到这个槽了。
第四个也是最后一个要建立的连接是moreButton按钮的toggled( bool)信号和tertiaryGroupBox群组框的setVisible(bool)槽之间的连接。这些连接一旦完成,就可以单击编辑->Edit Widgets而离开创建连接模式。
接下来是编写代码完成扩展对话框
//sortdialog.h
#ifndef SORTDIALOG_H
#define SORTDIALOG_H
#include <QDialog>
namespace Ui {
class SortDialog;
}
class SortDialog : public QDialog
{
Q_OBJECT
public:
explicit SortDialog(QWidget *parent = 0);
~SortDialog();
void setColumnRange(QChar first, QChar last);
//根据电子制表软件中选择的列初始化这些组合框的内容,在可选的第二键和第三键的组合框选项中插入了“None”选项。
private:
Ui::SortDialog *ui;
};
#endif // SORTDIALOG_H
//sortdialog.cpp
#include <QtWidgets>
#include "sortdialog.h"
#include "ui_sortdialog.h"
#include <QDebug>
SortDialog::SortDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SortDialog)
{
ui->setupUi(this);
//构造函数中隐藏了对话框中第二键和第三键这两个部分
ui->secondaryGroupBox->hide();
ui->tertiaryGroupBox->hide();
//把窗体布局(布局名改为layout)的SizeConstraint设置为QLayout::SetFixedSize,这样使用户不能再重新修改这个对话框的窗体大小。
//这里书上没有修改对话框栅格布局layoutName为layout,直接使用会报错,记得在ui中修改
ui->layout->setSizeConstraint(QLayout::SetFixedSize);
//这样一来,布局就会负责对话框重新定义大小的职责,并且也会在显示或者隐藏子窗口部件的时候自动重新定义这个对话框的大小,从而可以确保对话框总是能以最佳的尺寸显示出来。
setColumnRange('A', 'Z');//组合框中内容设置为A到Z
}
void SortDialog::setColumnRange(QChar first, QChar last)
{
ui->primaryColumnCombo->clear();
ui->secondaryColumnCombo->clear();
ui->tertiaryColumnCombo->clear();
ui->secondaryColumnCombo->addItem(tr("None"));
ui->tertiaryColumnCombo->addItem(tr("None"));
//这里我的ui文件第一次出了问题,不知道错在哪里总是无法实现一致性效果,最后把样例的ui文件拿过来就没问题了。重新做了一遍可能是创建新的群组框时出现了错误
ui->primaryColumnCombo->setMinimumSize(ui->secondaryColumnCombo->sizeHint());
//给出了布局中的一个特殊习惯用语。QWidget::sizeHint()函数可以返回布局系统试图认同的"理想"大小。
//这也解释了为什么不同的窗口部件或者具有不同内容的类似窗口部件通常会被布局系统分配给不同的尺寸大小。
//对于这些组合框,这里指的是第二键组合框和第三键组合框,由于它们包含了一个”None”选项
//所以它们要比只包含了一个单字符项目的主键组合框显得宽一些。
//为了避免这种不一致性,需要把主键组合框的最小大小设置成第二键组合框的理想大小。
QChar ch = first;
while (ch <= last) {
ui->primaryColumnCombo->addItem(QString(ch));
ui->secondaryColumnCombo->addItem(QString(ch));
ui->tertiaryColumnCombo->addItem(QString(ch));
ch = ch.unicode() + 1;
}
}
SortDialog::~SortDialog()
{
delete ui;
}
//main.cpp
#include <QApplication>
#include "sortdialog.