初識Qt佈局管理器

Qt佈局管理器的類有4種,它們分別爲QHBoxLayout、QVBoxLayout、QGridLayout和QStackLayout。其中,QHBoxLayout實現水平佈局,QVBoxLayout實現豎直佈局,QGridLayout實現表格佈局,QStackLayout實現分組佈局。經過對這幾種佈局的嵌套組合,就能夠實現複雜的對話框設計。ide

先看一個實現組件豎直佈局的例子。函數

 1 #include <QApplication>
 2 #include<QLabel>
 3 #include<QPushButton>
 4 #include<QHBoxLayout>
 5 #include<QSlider>
 6 #include<QSpinBox>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     QApplication a(argc, argv);
11     QLabel*w=new QLabel("<h2><i>Hello</i><font color=red>  World!</font></h2>");
12     //QLabel*w=new QLabel("Hello World!");
13     QWidget *window=new QWidget;
14     window->setWindowTitle("Enter Your Age");
15 
16     QPushButton *button=new QPushButton("Quit");
17     QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()) );
18 
19     QSpinBox *spinbox = new QSpinBox;
20     QSlider *slider = new QSlider(Qt :: Horizontal);//(Qt::Vertical); 滑動條的擺放方式選擇,水平仍是豎直
21     spinbox->setRange(0 , 130);
22     slider->setRange(0 , 130);
23 
24     QObject::connect(spinbox , SIGNAL(valueChanged(int)) , slider , SLOT( setValue(int)));
25     QObject::connect(slider , SIGNAL(valueChanged(int)) , spinbox , SLOT( setValue(int)));
26 
27     spinbox->setValue(35);
28 
29     //QHBoxLayout爲水平方擺放接下來的控件,QVBoxLayout爲豎直襬放接下來的控件
30     QVBoxLayout *layout = new QVBoxLayout;
31     layout->addWidget(w);
32     layout->addWidget(spinbox);//addWidget()雖定義自類QHBoxLayout,但屬於QHBoxLayout繼承於類QLayout的函數
33     layout->addWidget(slider);
34     layout->addWidget(button);
35 
36     window->setLayout(layout);
37     window->show();
38 
39     return a.exec();
40 }

該程序比較簡單,主要實現了hello world的顯示、Spinbox和Slider之間的相互賦值(Qt的信號槽機制)、豎直佈局以及PushButton的簡單使用,運行程序,顯示以下:
佈局

現實中應用到的對話框不單單是單一的佈局,而是牽涉到水平佈局和豎直佈局的綜合使用,下面經過一段程序來理解如何實現水平佈局和豎直佈局的嵌套使用。ui

 1 #include <QApplication>
 2 #include<QLabel>
 3 #include<QPushButton>
 4 #include<QHBoxLayout>
 5 #include<QSlider>
 6 #include<QSpinBox>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     QApplication a(argc, argv);
11     QLabel*w=new QLabel("<h2><i>Hello</i><font color=red>  World!</font></h2>");
12     //QLabel*w=new QLabel("Hello World!");
13     QWidget *window=new QWidget;
14     window->setWindowTitle("Enter Your Age");
15 
16     QPushButton *button=new QPushButton("Quit");
17     QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()) );
18 
19     QSpinBox *spinbox = new QSpinBox;
20     QSlider *slider = new QSlider(Qt :: Horizontal);//(Qt::Vertical); 滑動條的擺放方式選擇,水平仍是豎直
21     spinbox->setRange(0 , 130);
22     slider->setRange(0 , 130);
23 
24     QObject::connect(spinbox , SIGNAL(valueChanged(int)) , slider , SLOT( setValue(int)));
25     QObject::connect(slider , SIGNAL(valueChanged(int)) , spinbox , SLOT( setValue(int)));
26 
27     spinbox->setValue(35);
28 
29     QHBoxLayout *belowleftlayout = new QHBoxLayout;
30     belowleftlayout->addWidget(spinbox);
31     belowleftlayout->addWidget(slider);
32 
33     QVBoxLayout *leftlayout = new QVBoxLayout;
34     leftlayout->addWidget(w);
35     leftlayout->addLayout(belowleftlayout); //注意這裏用的是addLayout()函數
36 
37     QVBoxLayout *rightlayout = new QVBoxLayout;
38     rightlayout->addStretch();// 伸展器,用來佔據它所在佈局過程當中的空間
39     rightlayout->addWidget(button);
40 
41     QHBoxLayout *layout = new QHBoxLayout;
42     layout->addLayout(leftlayout);
43     layout->addLayout(rightlayout);
44 
45     window->setLayout(layout);
46     window->show();
47 
48     return a.exec();
49 }

運行程序結果顯示:
spa

經過上圖,咱們實現了組件按照咱們不一樣的要求進行的相應佈局。因爲在對右側進行豎直佈局時,添加伸展器Stretch,所以Quit按鍵位於右下角。設計

當註釋掉rightlayout->addStretch();語句後,能夠清楚的看到伸展器Stretch所起的做用。運行程序結果顯示以下:code

相關文章
相關標籤/搜索