佈局相關對象及簡介
窗體上的所有的控件必須有一個合適的尺寸和位置。Qt提供了一些類負責排列窗體上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。(佈局管理類)這些類簡單易用,無論在代碼中還是用Qt Designer開發程序都能用到。
1) 佈局類簡介
QHBoxLayout:水平佈局
QVBoxLayout:垂直佈局
QGridLayout: 表格佈局
QGridLayout::addWidget()語法
layout->addWidget(widget, row, column, rowSpan, columnSpan);
參數widget:爲插入到這個佈局的子控件;
參數(row,column)爲控件佔據的左上角單元格位置;
參數rowSpan是控件佔據的行數,
參數colunmSpan是控件佔據的列的個數。
(rowSpan和colunmSpan默認值爲1)
Stacked Layouts:分組佈局
QStackedLayout類把子控件進行分組或者分頁,一次只顯示一組或者一頁,隱藏其他組或者頁上的控件。
使用這些Qt佈局管理類的另一個原因是,在程序、系統改變字體,語言或者在不同的平臺上運行時,佈局管理器能夠自動調整窗體裏所有控件的大小和尺寸。
其他可進行佈局管理的類:這些類的共同特點是提供了更加靈活的佈局管理,在一定程度上用戶能夠控制窗體內控件的大小。
QSplitter,QScrollArea,QMainWindow,QWorkspace(對多文檔的支持)
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);
圖例:
1.1.1.1. 手工佈局
給出控件的絕對位置,但是他們的尺寸根據窗口的大小確定,可以通過重寫窗體控件的resizeEvent()實現對子控件的大小設置。
1.1.1.1. 佈局管理器
例子1:運用QHBoxLayout、QVBoxLayout、QGridLayout佈局
//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圖列:
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();
圖例: