目錄
布局管理器
QVBoxLayout
QHBoxLayout
QGirdLayout
QFormLayout?
Spacer
布局管理器
在以往的界面操作上,都是程序員手動拖動控件來布局,這種方式有一些不足之處,比如不能很好的把握控件之間的距離,以及控件的大小,并且在最終的窗口中,改變窗口大小時,控件的大小不能很好的適應。
于是,引入布局管理器,它是一種控件,可以自動管理其他控件。
常見的布局管理器有垂直布局管理器、水平布局管理器、網格布局、表單布局。
QVBoxLayout
?
布局管理器只用于界面布局,不提供信號。
?
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 創建三個按鈕QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");// 創建布局管理器, 并且把按鈕添加進去// 如果創建的時候指定?元素為 this, 則后?不需要 setLayout ?法了.QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(btn1);layout->addWidget(btn2);layout->addWidget(btn3);// 把布局管理器設置到 widget 中this->setLayout(layout);
}
?
每個Widget只能設置一個布局管理器。
使用Qt Design創建兩個布局管理器
?
?
程序運行后,界面可以正常顯示。但是,這兩個布局管理器并不會適應窗口的大小變化,因為本質上這是兩個Widget。
QHBoxLayout
垂直布局中可以嵌套一個水平布局,反過來也可以。
QGirdLayout
網格布局,可以實現M * N的效果。
?
?
QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 1, 1);layout->addWidget(btn3, 2, 2);layout->addWidget(btn4, 3, 3);this->setLayout(layout);
?
?
- ?設置水平方向的拉伸系數
?
// 創建 6 個按鈕QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QPushButton* btn5 = new QPushButton("按鈕5");QPushButton* btn6 = new QPushButton("按鈕6");// 創建?格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 0, 2);layout->addWidget(btn4, 1, 0);layout->addWidget(btn5, 1, 1);layout->addWidget(btn6, 1, 2);// 設置拉伸?例// 第 0 列拉伸?例設為 1;layout->setColumnStretch(0, 1);// 第 1 列拉伸?例設為 0, 即為固定??, 不參與拉伸layout->setColumnStretch(1, 0);// 第 2 列拉伸?例設為 3, 即為第 2 列的寬度是第 0 列的 3 倍layout->setColumnStretch(2, 3);// 設置 layout 到窗?中.this->setLayout(layout);
?
- 設置垂直方向的拉伸系數
?
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 創建 6 個按鈕QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");QPushButton* btn3 = new QPushButton("按鈕3");QPushButton* btn4 = new QPushButton("按鈕4");QPushButton* btn5 = new QPushButton("按鈕5");QPushButton* btn6 = new QPushButton("按鈕6");// 設置按鈕的 sizePolicy, 此時按鈕的?平?向和垂直?向都會盡量舒展開btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);// 創建?格布局管理器, 并且添加元素QGridLayout* layout = new QGridLayout();layout->addWidget(btn1, 0, 0);layout->addWidget(btn2, 0, 1);layout->addWidget(btn3, 1, 0);layout->addWidget(btn4, 1, 1);layout->addWidget(btn5, 2, 0);layout->addWidget(btn6, 2, 1);// 設置拉伸?例// 第 0 ?拉伸?例設為 1;layout->setRowStretch(0, 1);// 第 1 ?拉伸?例設為 0, 即為固定??, 不參與拉伸layout->setRowStretch(1, 0);// 第 2 ?拉伸?例設為 3, 即為第 2 ?的寬度是第 0 ?的 3 倍layout->setRowStretch(2, 3);
// 設置 layout 到窗?中.this->setLayout(layout);}
?
什么是SizePolicy
在界面中,每個按鈕的高度是固定,即使布局管理器按照比例設置了拉伸系數,也是沒有效果的,而想讓設置生效,就要設置每個按鈕的SizePolicy,按鈕的尺寸策略有如下幾種。
QFormLayout?
表單布局,N行2列,主要用于填表這樣的場景。
?
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 創建 layoutQFormLayout* layout = new QFormLayout();this->setLayout(layout);// 創建三個 labelQLabel* label1 = new QLabel("姓名");QLabel* label2 = new QLabel("年齡");QLabel* label3 = new QLabel("電話");// 創建三個 lineEditQLineEdit* lineEdit1 = new QLineEdit();QLineEdit* lineEdit2 = new QLineEdit();QLineEdit* lineEdit3 = new QLineEdit();// 創建?個提交按鈕QPushButton* btn = new QPushButton("提交");// 把上述元素添加到 layout 中layout->addRow(label1, lineEdit1);layout->addRow(label2, lineEdit2);layout->addRow(label3, lineEdit3);layout->addRow(NULL, btn);
}
?
Spacer
Spacer不屬于布局管理器,往往搭配在布局管理器中使用,表示一個空白塊,可以用來讓兩個控件之間的距離變大。
- 屬性
?
?
Widget::Widget(QWidget *parent): QWidget(parent)
, ui(new Ui::Widget){ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();this->setLayout(layout);QPushButton* btn1 = new QPushButton("按鈕1");QPushButton* btn2 = new QPushButton("按鈕2");// 創建 SpacerQSpacerItem* spacer = new QSpacerItem(200, 20);layout->addWidget(btn1);// 在兩個 widget 中間添加空?layout->addSpacerItem(spacer);layout->addWidget(btn2);}
?