Qt5 布局管理器

所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt 提供了两种组件定位机制:绝对定位和布局定位。

顾名思义,绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。如果你需要让组件自动更新——这是很常见的需求,比如在最大化时,Word 总会把稿纸区放大,把工具栏拉长——就要自己编写相应的函数来响应这些变化。或者,还有更简单的方法:禁止用户改变窗口大小。但这总不是长远之计。

针对这种变化的需求,Qt 提供了另外的一种机制——布局——来解决这个问题。你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。下面来看一个例子:

#include "mainwindow.h"
#include <QApplication>
#include<QSpinBox>
#include<QSlider>
#include<QHBoxLayout>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*MainWindow w;
    w.show();*/
   QWidget window;
       window.setWindowTitle("Enter your age");
       QIcon icon(":/images/pic.png");
       window.setWindowIcon(icon);
       QSpinBox *spinBox = new QSpinBox(&window);
       QSlider *slider = new QSlider(Qt::Horizontal, &window);
       spinBox->setRange(0, 130);
       slider->setRange(0, 130);

       QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
       void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
       QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
       slider->setValue(35);

       QHBoxLayout *layout = new QHBoxLayout;
       layout->addWidget(spinBox);
       layout->addWidget(slider);
       window.setLayout(layout);

       window.show();
    return a.exec();
}

运行结果:

参考链接:https://www.devbean.net/2012/09/qt-study-road-2-layout/

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/85843640
今日推荐