参考:
C++ GUI Programming with Qt 4, Second Edition
本地环境:
win10专业版,64位,Qt5.12
效果
初始状态是:
点击 More 按钮:
可以看到,每个combobox中都有代码填充的选项。
构造
构造基础版
-
新建一个Qt Form,选择Dialog without Buttons模板,然后再Qt Designer中打开。
-
新建一个名为okButton的Push Button,改显示内容位为OK,并把default属性勾选上。
-
再新建一个名为cancelButton的Push Button,改text为Cancel。
-
拖一个Vertical Spacer。
-
新建一个名为moreButton的Push Button,改text为&More,并且把checkable设为true。
-
把上述四个小组件按顺序叠放,然后全部选中,点击“垂直布局”,现在四个已经组合好了。
-
拖一个group box,改title为Primary Key,然后拖两个label、两个combobox和一个horizontal spacer进来,修改label的text。
-
在第一个combobox上右键,选择
编辑项目
,然后添加一个字段None
;在第二个combobox上右键,添加字段Ascending
和Descending
。 -
点击group box,再点击Grid布局。然后可以选中所有再点Grid布局,也可以点adjust size。总之,现在的状态是:
构造要展开的部分
- 复制第一个group box两次,分别修改title是&Secondary Key和&Tertiary Key,然后在前两个group box中间加一个vertical spacer
- 排版,调整到觉得满意
- 修改当前的dialog的名字叫 SortDialog,然后改window title为 Sort
最终效果:
预览:
编辑tab顺序
在编辑tab order模式下,从上到下依次点击各个combobox,再从上到下点击各个按钮,点完切换回编辑widget模式。
编辑槽
- 在编辑连接模式下,按住按钮,拖动到空白处释放,然后在弹出的窗口里配置,将clicked()连到accept()上。
- cancelButton则是clicked()连到右侧的reject()。
- moreButton需要依次连接下面两个group box,将toggled()与setVisible()相连。如果右侧没有setVisible,勾选下面的选项。
稍微调整了一下,最终的ui和对象名称如下图所示:
需要注意的是,最顶层的SortDialog也做了一个布局(可以右键-布局),做这个布局是为了后面固定窗口大小。
编写代码
folddialog.h
#ifndef FOLDDIALOG_H
#define FOLDDIALOG_H
#include <QDialog>
#include "ui_folddialog.h"
namespace Ui {
class FoldDialog;
}
class QWidget;
class FoldDialog : public QDialog, public Ui::SortDialog {
Q_OBJECT
public:
FoldDialog(QWidget *parent=0);
void setColumnRange(QChar first, QChar last);
};
#endif // FOLDDIALOG_H
folddialog.cpp
需要注意的是:如果在上面绘图部分,没有对SortDialog做布局的话,运行到layout()->setSizeConstraint(QLayout::SetFixedSize);
会报错:
The process was ended forcefully.
这是因为此时是没有layout的,但用了。。因此只需要设置好布局就可以了。
参考:
Qt Creator中编译运行Qt项目时报“程序异常结束”错误的解决思路 - 知乎
https://zhuanlan.zhihu.com/p/353320725
#include <QtGui>
#include "folddialog.h"
FoldDialog::FoldDialog(QWidget *parent):QDialog (parent) {
setupUi(this);
groupBox_2->hide(); // 隐藏第二个
groupBox_3->hide(); // 隐藏第三个
// 这样用户不能调节大小
layout()->setSizeConstraint(QLayout::SetFixedSize);
setColumnRange('A', 'Z');
}
void FoldDialog::setColumnRange(QChar first, QChar last){
// 第一个表示column的combobox
comboBox->clear();
//comboBox->addItem(tr("None"));
comboBox->setMinimumSize(comboBox_3->sizeHint());
// 第二个表示column的combobox
comboBox_3->clear();
// 添加对象
comboBox_3->addItem(tr("None"));
// 第三个表示column的combobox
comboBox_5->clear();
comboBox_5->addItem(tr("None"));
QChar ch = first;
while (ch <= last) {
comboBox->addItem(QString(ch));
comboBox_3->addItem(QString(ch));
comboBox_5->addItem(QString(ch));
ch = ch.unicode() + 1;
}
}
main.cpp
#include <QApplication>
#include "folddialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FoldDialog *dialog = new FoldDialog;
dialog->setColumnRange('C', 'F');
dialog->show();
return a.exec();
}