qt5-入门-可变形的对话框

参考:
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上右键,添加字段AscendingDescending

  • 点击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();
}

  • 34
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值