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