• 第二十二课、布局管理器(一)------------------狄泰软件学院


    一、目前的GUI开发方式:绝对定位

    1、直接在像素级指定各个组件的位置和大小

    (1)、void Qwidget::move(int x, int y)

    (2)、void Qwidget::resize(int x, int y)

    2、问题:组件的大小和位置无法自适应父窗口的变化

    二、布局管理器

    1、Qt提供相关的类对界面组件进行布局管理

    (1)、能够自动排列窗口中的界面组件

    (2)、窗口变化后自动更新界面组件的大小

    2、QLayout类

    (1)、QLayout是Qt中布局管理器的抽象基类

    (2)、通过继承QLayout实现了功能各异且互补的布局管理器

    (3)、Qt中可以根据需要自定义布局管理器

    (4)、布局管理器不是界面部件而是界面部件的定位策略

    3、QBoxLayout布局管理器

    (1)、以水平或者垂直的方式管理界面组件

    4、布局管理器可以互相嵌套,形成更加复杂的布局形式

    (1)、布局嵌套几乎可以完成所有常用的界面布局

    (2)、自定义布局类可以达到个性化界面布局的效果

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QtGui/QWidget>
    #include <QPushButton>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    private:
        QPushButton Btn1;
        QPushButton Btn2;
        QPushButton Btn3;
        QPushButton Btn4;
    
        void QLayoutTest();
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    };
    
    #endif // WIDGET_H
    Widget.h
    #include "Widget.h"
    #include <QVBoxLayout>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent), Btn1(this), Btn2(this), Btn3(this), Btn4(this)
    {
        QLayoutTest();
    }
    
    void Widget::QLayoutTest()
    {
        Btn1.setText("Btn1");
        Btn2.setText("Btn2");
        Btn3.setText("Btn3");
        Btn4.setText("Btn4");
    
        Btn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);//水平和垂直都随主窗口拓宽
        Btn1.setMinimumSize(160,50);
        Btn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
        Btn2.setMinimumSize(160,50);
        Btn3.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
        Btn3.setMinimumSize(160,50);
        Btn4.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
        Btn4.setMinimumSize(160,50);
    
    
        QVBoxLayout* vlayout1 = new QVBoxLayout();
        QVBoxLayout* vlayout2 = new QVBoxLayout();
        QHBoxLayout* hlayout  = new QHBoxLayout();
        vlayout1->addWidget(&Btn1);
        vlayout1->addWidget(&Btn2);
        vlayout2->addWidget(&Btn3);
        vlayout2->addWidget(&Btn4);
    
        hlayout->addLayout(vlayout1);//布局管理器的嵌套
        hlayout->addLayout(vlayout2);//注意这里是addLayout
    
        hlayout->setSpacing(10);//间距大小
        setLayout(hlayout);//设置布局管理器
    
    }
    
    Widget::~Widget()
    {
        
    }
    Widget.cpp
    #include <QtGui/QApplication>
    #include "Widget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
        
        return a.exec();
    }
    main.cpp

    三、小结

    (1)、绝对定位的布局方式无法自适应窗口的变化

    (2)、Qt提供相关的类对界面组件进行布局管理

    (3)、Qt预定义了功能各异且互补的布局管理器

     (4)、布局管理器能够互相嵌套形成复杂的布局

  • 相关阅读:
    uboot主Makefile之1——HOSTARCH&HOSTOS
    uboot主Makefile之3——BUILD_DIR(Line 78-93)
    Makefile的ifeq逻辑或,逻辑与的变通实现
    uboot主Makefile解析第二篇
    uboot主Makefile解析第一篇
    mkdir -p X 中的“-p”是的意思
    uboot主Makefile中的origin函数
    原生javascript实现call、apply和bind的方法
    js如何判断数组是Array类型
    三栏布局的5种解决方案及优缺点
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6403755.html
Copyright © 2020-2023  润新知