1. 程式人生 > >Qt5.9佈局管理器例項(QVBoxLayout,QHBoxLayout,QGridLayout)(一個簡單的手寫介面例項)

Qt5.9佈局管理器例項(QVBoxLayout,QHBoxLayout,QGridLayout)(一個簡單的手寫介面例項)

本部落格主要總結用Qt5.9手寫一個介面,該介面的pushButton,linetxt控制元件都用程式碼來實現,同時手寫水平佈局、垂直佈局、柵格佈局,具體的用法如下所述。

注意:QGridLayout,QHLayout,QVLayout三個佈局管理器類,可以混合包括,但是有且只能有一個主要佈局。比如柵格佈局裡面包括了水平佈局,垂直佈局,柵格佈局三塊。

1.1新建一個widget工程,然後分別在widget.h,widget.cpp分別新增如下程式碼,main.cpp函式不變。

widget.h

#ifndefWIDGET_H
#defineWIDGET_H
#include<QWidget>
#include
<QVBoxLayout>//垂直佈局
#include<QHBoxLayout>//水平佈局
#include<QGridLayout>//柵格佈局
#include<QPushButton>//按鈕空間類
#include<QLineEdit>//單行文字類
#include<QLabel>//labal標籤類
classWidget:publicQWidget
{
Q_OBJECT
public:
Widget(QWidget*parent=0);
~Widget();
private:
QPushButton*btn1;//定義一個按鈕
QHBoxLayout*hlayout1
,*hlayout2;//兩個水平佈局
QVBoxLayout*vlayout3;//垂直佈局
QGridLayout*glayout4;//柵格佈局
QLineEdit*edit1,*edit2,*edit3;//單行文字框
QLabel*label11;//標籤11
QLabel*label12;//標籤12
privateslots:
voidon_clicked();//單擊按鈕槽函式
};
#endif//WIDGET_H

widget.cpp

#include"widget.h"
Widget::Widget(QWidget*parent)
:QWidget(parent)
{
//視窗UI介面初始化
hlayout1=newQHBoxLayout
;//水平佈局初始化
hlayout2=newQHBoxLayout;
vlayout3=newQVBoxLayout(this);//垂直佈局初始化this表示在Widget視窗垂直佈局
//glayout4=newQGridLayout(this);//柵格佈局初始化this表示在Widget視窗柵格佈局
btn1=newQPushButton;//按鈕初始化
edit1=newQLineEdit;//單行文字初始化
edit2=newQLineEdit;//單行文字初始化
edit3=newQLineEdit;//單行文字初始化
label11=newQLabel;//label標籤初始化
label12=newQLabel;//這個控制元件沒有任何父控制元件
//柵格佈局方式
//glayout4->addWidget(btn1,0,0);//將按鈕加入水平佈局(0,0)表示第0行,第0列
//glayout4->addWidget(edit1,0,1);//將文字加入水平佈局(0,1)
//glayout4->addWidget(edit2,0,2);
//glayout4->addWidget(edit3,1,0);//將文字加入水平佈局(0,1)表示第0行,第1列
//glayout4->addWidget(label11,1,1);//將label標籤加入水平佈局(1,1)
//btn1->setText(tr("確定"));//初始化label標籤內容
//label11->setText(tr("label"));
//水平佈局方式用垂直佈局包裹水平佈局
hlayout1->setMargin(50);//設定佈局兩邊間距
hlayout1->addWidget(btn1);//水平佈局hlayout1新增按鈕物件
hlayout1->addWidget(edit1);
hlayout1->addWidget(edit2);
hlayout1->addWidget(edit3);
hlayout2->addWidget(label11);//水平佈局hlayout2新增標籤物件
label11->setText(tr("label%1").arg(rand()));
vlayout3->addLayout(hlayout1);//垂直佈局vlayout3新增水平佈局hlayout1
vlayout3->addLayout(hlayout2);//垂直佈局vlayout3新增水平佈局hlayout2
//this->resize(300,100);//定義視窗尺寸
//點選btn1按鈕,觸發槽函式on_clicked()
connect(btn1,SIGNAL(clicked(bool)),this,SLOT(on_clicked()));//關聯函式將訊號與槽繫結
}
Widget::~Widget()
{
//deletehlayout1;在QT內部,不要單獨delete一個控制元件的指標
//QT的視窗在退出的時,自動delete它相關的子控制元件
deletelabel12;//釋放label12標籤記憶體
}
voidWidget::on_clicked()
{
edit1->setText(tr("Ian%1lineTxt").arg(rand()));
edit2->setText(tr("Ian%1lineTxt").arg(rand()));
edit3->setText(tr("Ian%1lineTxt").arg(rand()));
label11->setText(tr("label%1").arg(rand()));
}

1.2編譯執行後結果如下圖所示:

注意:下面有且只能有一個this指標。

hlayout1=newQHBoxLayout;//水平佈局初始化
hlayout2=newQHBoxLayout;
vlayout3=newQVBoxLayout(this);//垂直佈局初始化this表示在Widget視窗垂直佈局

程式在運用佈局管理器時,上面的this表示在Widget視窗中,所以佈局管理器只能選擇一個this,不能出現兩個佈局管理器,同時呼叫一個this。也就說,當用柵格佈局管理器初始化時,用了this指標,則在垂直管理器中,就不能用this初始化,否則會出現佈局衝突。

參考內容:

http://www.cnblogs.com/Bonker/p/3454956.html(詳細參考,可以設定各個空間間距,佈局邊緣距離)

https://blog.csdn.net/jingzhesiye/article/details/6657166(綜合應用:柵格佈局裡面嵌入水平佈局、垂直佈局、柵格佈局)

https://blog.csdn.net/tototuzuoquan/article/details/38480613

https://blog.csdn.net/ddupd/article/details/38292277