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 窗體佈局 - 黑黑的大鯊魚 - 黑黑的大鯊魚

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章