Qt 窗體布局


 布局相關對象及簡介

窗體上的所有的控件必須有一個合適的尺寸和位置。Qt提供了一些類負責排列窗體上的控件,主要有:QHBoxLayoutQVBoxLayoutQGridLayoutQStackLayout。(布局管理類)這些類簡單易用,無論在代碼中還是用Qt Designer開發程序都能用到。

Qt 窗體布局 - 黑黑的大鯊魚 - 黑黑的大鯊魚

1)         布局類簡介

QHBoxLayout:水平布局

QVBoxLayout:垂直布局

QGridLayout 表格布局

QGridLayout::addWidget()語法

layout->addWidget(widget, row, column, rowSpan, columnSpan);

參數widget:為插入到這個布局的子控件;

參數(rowcolumn)為控件占據的左上角單元格位置;

參數rowSpan是控件占據的行數,

參數colunmSpan是控件占據的列的個數。

rowSpancolunmSpan默認值為1

Stacked Layouts:分組布局

     QStackedLayout類把子控件進行分組或者分頁,一次只顯示一組或者一頁,隱藏其他組或者頁上的控件。

 

使用這些Qt布局管理類的另一個原因是,在程序、系統改變字體,語言或者在不同的平台上運行時,布局管理器能夠自動調整窗體里所有控件的大小和尺寸。

 

其他可進行布局管理的類:這些類的共同特點是提供了更加靈活的布局管理,在一定程度上用戶能夠控制窗體內控件的大小。

QSplitterQScrollAreaQMainWindowQWorkspace(對多文檔的支持)

 

 

 

2)         布局管理中結合控件的sizePolicy屬性,進行調整

   結合控件的SizePolicy屬性,來控制布局管理中的控件的尺寸自適應方式。

控件的sizePolicy說明控件在布局管理中的縮放方式。Qt提供的控件都有一個合理的缺省sizePolicy,但是這個缺省值有時不能適合所有的布局,開發人員經常需要改變窗體上的某些控件的sizePolicy。一個QSizePolicy的所有變量對水平方向和垂直方向都適用。下面列舉了一些最長用的值:

A. Fixed:控件不能放大或者縮小,控件的大小就是它的sizeHint

B. Minimum:控件的sizeHint為控件的最小尺寸。控件不能小於這個sizeHint,但是可以

放大。

C. Maximum:控件的sizeHint為控件的最大尺寸,控件不能放大,但是可以縮小到它的最小

的允許尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者縮小

E. Expandint:控件可以自行增大或者縮小

注:sizeHint(布局管理中的控件默認尺寸,如果控件不在布局管理中就為無效的值)

 

 

1.1.1.       布局管理的三種方式

Qt中有三種方式對窗體上的控件進行布局管理:絕對位置定位(absolute positioning),手工布局(manual layout),布局管理器(layout managers

1.1.1.1.      絕對位置定位(控件布局是固定位置,沒有自適應功能)

例子:

QWidget *pWidget = new QWidget;

QLabel label(pWidget);

label.setText(QObject::tr("姓名:"));

label.setGeometry(10,10,20,20);

 

QLineEdit namedLineEdit("小明",pWidget);

namedLineEdit.setGeometry(35,10,50,20);

 

QPushButton *btn = new QPushButton(QObject::tr("關閉"),pWidget);

     btn->setGeometry(90,10,40,20);

圖例:

Qt 窗體布局 - 黑黑的大鯊魚 - 黑黑的大鯊魚

1.1.1.1.      手工布局

給出控件的絕對位置,但是他們的尺寸根據窗口的大小確定,可以通過重寫窗體控件的resizeEvent()實現對子控件的大小設置。

 

1.1.1.1.      布局管理器

 

例子1運用QHBoxLayout、QVBoxLayout、QGridLayout布局

Qt 窗體布局 - 黑黑的大鯊魚 - 黑黑的大鯊魚

 

 

 

 

//leftLayout布局設置(表格布局)

/* QGridLayout: 二維的單元格*/

     QGridLayout *leftLayout = new QGridLayout;

     leftLayout->addWidget(&namedLabel, 0, 0); //起始(0行,0列),尺寸(1行,1列)

     leftLayout->addWidget(&namedLineEdit, 0, 1);

     leftLayout->addWidget(&lookInLabel, 1, 0);

     leftLayout->addWidget(&lookInLineEdit, 1, 1);

     leftLayout->addWidget(&subDirCheckBox, 2, 0, 1, 2);//起始(3行,0列),尺寸(1行,2列)

     leftLayout->addWidget(&tableWidget, 3, 0, 1, 2);

     leftLayout->addWidget(&messageLabel, 4, 0, 1, 2);

   //rightLayout布局設置(垂直布局)

     QVBoxLayout *rightLayout = new QVBoxLayout;

     rightLayout->addWidget(&findButton);

     rightLayout->addWidget(&stopButton);

     rightLayout->addWidget(&closeButton);

//布局管理器在指定的位置留出一塊空間(Qt Designer中,可以加入一個spacer實現這一功能)

     rightLayout->addStretch();

     rightLayout->addWidget(&helpButton);

     //mainLayout布局設置(水平布局)

     QHBoxLayout *mainLayout = new QHBoxLayout;

     mainLayout->addLayout(leftLayout);

     mainLayout->addLayout(rightLayout);

     pWidget->setLayout(mainLayout);//設置Widget窗口控件的布局風格

     pWidget->setWindowTitle(QObject::tr("查找文件及文件夾"));

     

例子1圖列:

Qt 窗體布局 - 黑黑的大鯊魚 - 黑黑的大鯊魚

 

 

1.1.1.1.1.     例子2:運用Stacked Layouts:分組布局

例子:

//創建QWidget類的一個對象pWidget

QWidget *pWidget = new QWidget;

//創建一個布局管理器類 layout

QHBoxLayout *manLayout = new QHBoxLayout;

//左邊的列表控件

QListWidget *listWidget = new QListWidget(pWidget);

listWidget->addItem(QObject::tr("外觀設置"));

listWidget->addItem(QObject::tr("網頁瀏覽"));

       ...   

 

//右邊的分頁控件

QWidget *page1 = new QWidget(pWidget);

<…page1上增加控件>

QWidget *page2 = new QWidget(pWidget);

<…page2上增加控件>

<設置布局管理>

QVBoxLayout *leftLayout = new QVBoxLayout;

leftLayout->addWidget(listWidget);

....

//右邊分頁布局(兩頁窗口)

QStackedLayout *stackedLayout = new QStackedLayout;

stackedLayout->addWidget(page1);

stackedLayout->addWidget(page2);

 

//通過調用QWidget::setLayout()函數,layout布局管理器類添加到窗口部件對象pWidget

manLayout->addLayout(leftLayout);

manLayout->addLayout(stackedLayout);

pWidget->setLayout(manLayout);

 

listWidget->setCurrentRow(0);

//關聯:列表與分組布局

QObject::connect(listWidget, SIGNAL(currentRowChanged(int)),

stackedLayout, SLOT(setCurrentIndex(int)));

pWidget->show();

圖例:

Qt 窗體布局 - 黑黑的大鯊魚 - 黑黑的大鯊魚

Qt 窗體布局 - 黑黑的大鯊魚 - 黑黑的大鯊魚


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM