QT布局实践1——布局雏形

QT布局实践1——布局雏形

一直以来对布局感觉get不到点,最近就花点时间来实践一下,弄一个纯手动布局的界面。力求做到全适应。

做一个界面慢慢加东西把,大概是下面图的样子,红色区域随意伸缩,绿色区域也是,但是宽度有最大值和最小值。蓝色和橙色是固定的高,只能进行左右伸缩。 

一、设置基础的布局

首先创建一个无界面的mainwindow,布局我就分为2个部分写,红绿为上部分布局,蓝橙为下部分。

大概就是先在QHBoxLayout1 中加入红绿,QHBoxLayout2中加入蓝橙,然后再QVBoxLayout 把 QHBoxLayout1 和QHBoxLayout2 都加进去,最后设为主窗口的布局。

QHBoxLayout  *aboveLayout = new QHBoxLayout ( );  
aboveLayout->addWidget(widget_display);
this->setLayout(aboveLayout);

当我这样写,发现报错了,就是Attempting to set QLayout "" on MainWindow "MainWindow",which already has a layout 。

这个是 很重要的,mainwindow其实已经自带有布局了,参考http://blog.csdn.net/csdn_logo/article/details/48286785

解决方法:

第一步创建一个QWidget实例,并将这个实例设置为centralWidget。
第一步创建一个主布局mainLayout,并把所需要的所有控件都往里面放(工具栏、菜单栏、状态栏除外)。

最一步就是将widget的布局设置为mainLayout。

现在完成的雏形,4个格子,每个格子拉伸都是一样的。


二、设置的布局缩放

接下来就是要进行布局的比例设置了。

缩放因子:Stretch。这东西可以说是比例,比较易懂。

参考大神的http://blog.csdn.net/liang19890820/article/details/51986284

例如我拉伸窗口的时候,红绿的比例要一直为5:1,那么我可以这样写

aboveLayout->setStretch(0,5);
aboveLayout->setStretch(1,1);

在布局中设置,第一个参数为Layout添加的widget的顺序,我这里0 就是红色了。

上半部分和下班部分占比为10:1,类似同上:

allLayout->addLayout(aboveLayout,10);
allLayout->addLayout(belowLayout,1);

比例设置完后,还可以设置大小缩放的策略。

策略:SizePolicy 。也就是缩放的方法选择。

常量描述
QSizePolicy::Fixed0缺省大小是唯一可以接收的改变,因此部件不能放大也不能缩小。
QSizePolicy::MinimumGrowFlag缺省大小是最小值,并且是充分的。部件允许扩展,但是并不倾向扩展(例如:水平方向上的按钮),不能比缺省大小提供的大小更小。
QSizePolicy::MaximumShrinkFlag缺省大小是最大值,假如其它部件需要空间并且不会破坏该部件,那么该部件允许被缩小(例如:一个分割线)。
QSizePolicy::PreferredGrowFlag | ShrinkFlag缺省大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()大(QWidget的缺省策略)。
QSizePolicy::ExpandingGrowFlag | ShrinkFlag | ExpandFlag缺省大小是合理的大小,但部件允许缩小并且可用。部件可以利用额外的空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。
QSizePolicy::MinimumExpandingGrowFlag | ExpandFlag缺省大小是最小值,并且是足够的。部件允许使用额外空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。
QSizePolicy::IgnoredShrinkFlag | GrowFlag | IgnoreFlag缺省大小将会被忽略,部件将会得到尽可能多的空间。

由于我需要红色尽量的大,绿色不要变太多,写成:

QSizePolicy displaySizePolicy = widget_display->sizePolicy();
QSizePolicy listSizePolicy = widget_list->sizePolicy();
 
displaySizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
widget_display->setSizePolicy(displaySizePolicy);
listSizePolicy.setHorizontalPolicy(QSizePolicy::Preferred);
widget_list->setSizePolicy(listSizePolicy);

给红色设置Expanding,给绿色设置Preferred。

有时又不想每个格子变得太大或太小,可以设置他们的最大值和最小值。例如:

widget_list->setMaximumWidth(250);
widget_list->setMinimumWidth(250);

完成大概是这样的:


附上这一步的源码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QWidget>
#include <QObject>
#include <QPushButton>
#include <QListWidget>
#include <QLabel>
#include <QMainWindow>
#include <QHBoxLayout>
#include <QDebug>
class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    void UI_Init();
    void setUI_below(QVBoxLayout  *allLayout);
    void setUI_above(QVBoxLayout  *allLayout);
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QPushButton *btn_play;
    QPushButton *btn_stopplay;
    QPushButton *btn_record;
    QPushButton *btn_stoprecord;
    QWidget *widget_display;
    QWidget *widget_list;
    QWidget *widget_playctrl;
    QWidget *widget_recordctrl;
    QWidget *widget_Main;
    QListWidget *listwidget;
    QLabel *label_display;
};
 
#endif // MAINWINDOW_H
 

#include "mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    UI_Init();
}
 
MainWindow::~MainWindow()
{
 
}
void MainWindow::UI_Init()
{
    this->setGeometry(100,100,1080+250,720+80);
    widget_Main=new QWidget( );
    this->setCentralWidget(widget_Main);
    QVBoxLayout  *allLayout = new QVBoxLayout ();
    setUI_above(allLayout);
    setUI_below(allLayout);
    allLayout->setMargin(0);
    allLayout->setSpacing(0);
    widget_Main->setLayout(allLayout);
}
void MainWindow::setUI_above(QVBoxLayout  *allLayout)
{
 
    widget_display=new QWidget( );
    //widget_display->setMinimumWidth(720);
    widget_display->setStyleSheet("background-color:rgb(237,28,36)");
    widget_list=new QWidget( );
    widget_list->setMaximumWidth(250);
    widget_list->setMinimumWidth(250);
    widget_list->setStyleSheet("background-color:rgb(34,177,76 )");
    QHBoxLayout  *aboveLayout = new QHBoxLayout ( ); //布局新加的控件
    aboveLayout->addWidget(widget_display);
    aboveLayout->addWidget(widget_list);
    aboveLayout->setMargin(0);
    aboveLayout->setSpacing(0);
     aboveLayout->setStretch(0,5);
     aboveLayout->setStretch(1,1);
    //aboveLayout->setContentsMargins(QMargins(0,0,0,0));
    //widget_Main->setLayout(aboveLayout);
    allLayout->addLayout(aboveLayout,10);
 
    QSizePolicy displaySizePolicy = widget_display->sizePolicy();
    QSizePolicy listSizePolicy = widget_list->sizePolicy();
 
    displaySizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
    widget_display->setSizePolicy(displaySizePolicy);
    listSizePolicy.setHorizontalPolicy(QSizePolicy::Preferred);
    widget_list->setSizePolicy(listSizePolicy);
 
}
void MainWindow::setUI_below(QVBoxLayout  *allLayout)
{
 
    widget_playctrl=new QWidget( );
    widget_playctrl->setMaximumHeight(80);
    widget_playctrl->setMinimumHeight(80);
    //widget_playctrl->setMinimumWidth(720);
    widget_playctrl->setStyleSheet("background-color:rgb(0,162,232)");
    widget_recordctrl=new QWidget( );
    widget_recordctrl->setMaximumHeight(80);
    widget_recordctrl->setMinimumHeight(80);
    widget_recordctrl->setMaximumWidth(250);
    widget_recordctrl->setMinimumWidth(250);
    widget_recordctrl->setStyleSheet("background-color:rgb(255,127,39 )");
    QHBoxLayout  *belowLayout = new QHBoxLayout ( ); //布局新加的控件
    belowLayout->addWidget(widget_playctrl);
    belowLayout->addWidget(widget_recordctrl);
    belowLayout->setMargin(0);
    belowLayout->setSpacing(0);
    belowLayout->setStretch(0,5);
    belowLayout->setStretch(1,1);
    allLayout->addLayout(belowLayout,1);
 
    QSizePolicy playctrlSizePolicy = widget_playctrl->sizePolicy();
    QSizePolicy recordctrlSizePolicy = widget_recordctrl->sizePolicy();
 
    playctrlSizePolicy.setHorizontalPolicy(QSizePolicy::Expanding);
    widget_playctrl->setSizePolicy(playctrlSizePolicy);
    recordctrlSizePolicy.setHorizontalPolicy(QSizePolicy::Preferred);
    widget_recordctrl->setSizePolicy(recordctrlSizePolicy);
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值