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::Fixed | 0 | 缺省大小是唯一可以接收的改变,因此部件不能放大也不能缩小。 |
| QSizePolicy::Minimum | GrowFlag | 缺省大小是最小值,并且是充分的。部件允许扩展,但是并不倾向扩展(例如:水平方向上的按钮),不能比缺省大小提供的大小更小。 |
| QSizePolicy::Maximum | ShrinkFlag | 缺省大小是最大值,假如其它部件需要空间并且不会破坏该部件,那么该部件允许被缩小(例如:一个分割线)。 |
| QSizePolicy::Preferred | GrowFlag | ShrinkFlag | 缺省大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()大(QWidget的缺省策略)。 |
| QSizePolicy::Expanding | GrowFlag | ShrinkFlag | ExpandFlag | 缺省大小是合理的大小,但部件允许缩小并且可用。部件可以利用额外的空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。 |
| QSizePolicy::MinimumExpanding | GrowFlag | ExpandFlag | 缺省大小是最小值,并且是足够的。部件允许使用额外空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。 |
| QSizePolicy::Ignored | ShrinkFlag | 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);
}