QT之布局管理器(十九)
admin
2023-07-27 21:20:07
0次

        我们在之前的 GUI 开发中都是使用的是绝对定位,何谓绝对定位呢?就是我们直接在像素级指定各个组件的位置和大小。比如我们之前使用的 void QWidget::move(int x, int y);void QWidget::resize(int w, int h);这样存在的问题就是组件的位置和大小无法自适应父窗口的变化。

        我们先来看看绝对定位的代码和效果是怎样的?头文件代码如下:

#include 
#include 

class Widget : public QWidget
{
    Q_OBJECT
private:
    QPushButton TestBtn1;
    QPushButton TestBtn2;
    QPushButton TestBtn3;
    QPushButton TestBtn4;

    void initControl();
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

        具体函数代码如下:

void Widget::initControl()
{
    TestBtn1.setText("Test Button 1");
    TestBtn1.move(20, 20);
    TestBtn1.resize(160, 30);

    TestBtn2.setText("Test Button 2");
    TestBtn2.move(20, 70);
    TestBtn2.resize(160, 30);

    TestBtn3.setText("Test Button 3");
    TestBtn3.move(20, 120);
    TestBtn3.resize(160, 30);

    TestBtn4.setText("Test Button 4");
    TestBtn4.move(20, 170);
    TestBtn4.resize(160, 30);
}

        图一为构建运行后得到的原始界面,图二为我们放大后的效果图:

QT之布局管理器(十九)                    QT之布局管理器(十九)

            图一                                                                                    图二

        那么有什么解决方法吗?答案就是布局管理器,它能够提供相关的类对界面组件进行布局管理。能够自动排列窗口中的界面组件,窗口变化后自动更新界面组件的大小。

        QLayout 是 Qt 中布局管理器的抽象基类,通过继承 QLayout 实现了功能各异且互补的布局管理器、Qt 中可以根据需要自定义布局管理器。注意:布局管理器不是界面部件,而是界面部件的定位策略!!!

        关系如下所示:

QT之布局管理器(十九)


           QBoxLayout 布局管理器: 以水平或者垂直的方式管理界面组件,如下:

   QT之布局管理器(十九)QT之布局管理器(十九)

        我们下面来进行一组实验,我们先来以垂直的方式进行排布,代码如下:

void Widget::testVBoxLayout()
{
    QVBoxLayout* layout = new QVBoxLayout();

    TestBtn1.setText("Test Button 1");
    TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 设置水平和垂直方向都随之变化
    TestBtn1.setMinimumSize(160, 30);   // 设置最小界面大小

    TestBtn2.setText("Test Button 2");
    TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    TestBtn3.setText("Test Button 3");
    TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setText("Test Button 4");
    TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);;
    TestBtn4.setMinimumSize(160, 30);

    layout->setSpacing(20);         // 设置间距为20个像素
    layout->addWidget(&TestBtn1);   // 添加 TestBtn1
    layout->addWidget(&TestBtn2);
    layout->addWidget(&TestBtn3);
    layout->addWidget(&TestBtn4);

    setLayout(layout);
}

        图三为构建运行后得到的原始界面,图四为我们放大后的效果图:

QT之布局管理器(十九)                      QT之布局管理器(十九)

                图三                                                                                   图四

        我们再试下水平布局,在上面代码中仅仅只是将 QVBoxLayout 改成 QHBoxLayout,继续构建运行后效果如下:

QT之布局管理器(十九)

        那么我们的布局管理器还可以相互嵌套,形成更加复杂的布局方式。布局嵌套几乎可以完成所有常用的界面布局,我们还可以定义布局类以达到个性化布局的效果。下来我们就做个 QBoxLayout 嵌套示例,如下:

QT之布局管理器(十九)

        代码如下:

void Widget::testVHBoxLayout()
{
    QHBoxLayout* hLayout1 = new QHBoxLayout();  // 设置水平方向 hLayout1
    QHBoxLayout* hLayout2 = new QHBoxLayout();  // 设置水平方向 hLayout2
    QVBoxLayout* vLayout = new QVBoxLayout();   // 设置垂直方向 vLayout

    TestBtn1.setText("Test Button 1");
    TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    TestBtn1.setMinimumSize(160, 30);

    TestBtn2.setText("Test Button 2");
    TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    TestBtn2.setMinimumSize(160, 30);

    hLayout1->setSpacing(10);           // 设置间距
    hLayout1->addWidget(&TestBtn1);     // 水平方向添加 TestBtn1
    hLayout1->addWidget(&TestBtn2);     // 水平方向添加 TestBtn2

    TestBtn3.setText("Test Button 3");
    TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    TestBtn3.setMinimumSize(160, 30);

    TestBtn4.setText("Test Button 4");
    TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);;
    TestBtn4.setMinimumSize(160, 30);

    hLayout2->setSpacing(10);
    hLayout2->addWidget(&TestBtn3);
    hLayout2->addWidget(&TestBtn4);

    vLayout->setSpacing(10);            // 设置间距
    vLayout->addLayout(hLayout1);       // 竖直方向添加 hLayout1
    vLayout->addLayout(hLayout2);       // 竖直方向添加 hLayout2

    setLayout(vLayout);
}

        构建运行效果如下:

QT之布局管理器(十九)

        那么本次我们学习了布局管理相关的知识。绝对定位的布局方式是无法适应窗口的变化的,在 Qt 中提供了相关的类对界面组件进行布局管理。Qt 预定义了功能各异的且互补的布局管理器,布局管理器能够相互嵌套形成复杂的布局。在后面我们会接着对 Qt 的布局管理方式进行学习。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...