Qt中的布局管理器
文章目錄
- 1 Qt中的布局管理器
- 1.1 絕對定位存在的問題
- 1.2 Qt中的布局管理器
- 1.3 布局管理器的注意事項
- 2 布局管理器綜合示例
1 Qt中的布局管理器
1.1 絕對定位存在的問題
絕對定位直接在像素級指定各個組件的位置和大小:
- void QWidget::move(int x, int y)
- void QWidget::resize(int w, int h)
絕對定位存在的問題:
- 組件的位置和大小無法自適應父窗口的變化。
1.2 Qt中的布局管理器
布局管理器提供了相關的類對界面組件進行布局管理:
- 能夠自動排列窗口中的界面組件。
- 窗口變化后自動更新界面組件的大小。
QLayout:
- QLayout是Qt中布局管理器的抽象基類。
- 通過繼承QLayout實現了功能各異且互補的布局管理器。
- Qt中可以根據需要自定義布局管理器。
- 布局管理器不是界面部件,而是界面部件的定位策略。
1.3 布局管理器的注意事項
對于布局管理器:
- 任意容器類的組件都可以指定布局管理器。
- 同一個布局管理器中的組件擁有相同的父組件。
- 設置布局管理器的同時隱式的指定了父子關系。
組件1和組件2的父組件均為QWidget對應的對象。
2 布局管理器綜合示例
需求分析:練習開發一個向導用戶界面
- 在同一個界面上展現不同的向導頁面。
- 通過“上一步”和“下一步”按鈕進行切換。
- 不同頁面上的元素組件和組件排布都不相同。
- 頁面中的組件通過布局管理器進行排布。
通過布局嵌套進行界面設計:
通過QStackedLayout管理不同的頁面:
通過子組件的方式生成不同的頁面:
示例代碼如下:
Widget.h:
Widget.cpp:
#include "Widget.h" #include <QVBoxLayout> #include <QHBoxLayout> #include <QGridLayout> #include <QFormLayout> #include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent) {initControl(); }void Widget::initControl() {QVBoxLayout* vLayout = new QVBoxLayout();QHBoxLayout* hLayout = new QHBoxLayout();preBtn.setText("Pre Page");preBtn.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);preBtn.setMinimumSize(160, 30);nextBtn.setText("Next Page");nextBtn.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);nextBtn.setMinimumSize(160, 30);connect(&preBtn, SIGNAL(clicked()), this, SLOT(onPreBtnClicked()));connect(&nextBtn, SIGNAL(clicked()), this, SLOT(onNextBtnClicked()));hLayout->addWidget(&preBtn);hLayout->addWidget(&nextBtn);sLayout.addWidget(get1stPage());sLayout.addWidget(get2ndPage());sLayout.addWidget(get3rdPage());vLayout->addLayout(&sLayout);vLayout->addLayout(hLayout);setLayout(vLayout); }QWidget* Widget::get1stPage() {QWidget* ret = new QWidget();QGridLayout* layout = new QGridLayout();fLbl1.setText("This");fLbl2.setText("is");fLbl3.setText("1st");fLbl4.setText("page");layout->addWidget(&fLbl1, 0, 0);layout->addWidget(&fLbl2, 0, 1);layout->addWidget(&fLbl3, 1, 0);layout->addWidget(&fLbl4, 1, 1);ret->setLayout(layout);return ret; }QWidget* Widget::get2ndPage() {QWidget* ret = new QWidget();QFormLayout* layout = new QFormLayout();sLineEdit.setText("This is 2rd page");layout->addRow("Hint:", &sLineEdit);ret->setLayout(layout);return ret; }QWidget* Widget::get3rdPage() {QWidget* ret = new QWidget();QVBoxLayout* layout = new QVBoxLayout();tPushBtn1.setText("This is");tPushBtn2.setText("3rd page");layout->addWidget(&tPushBtn1);layout->addWidget(&tPushBtn2);ret->setLayout(layout);return ret; }void Widget::onPreBtnClicked() {int index = ((sLayout.currentIndex() - 1) + 3) % 3;sLayout.setCurrentIndex(index); }void Widget::onNextBtnClicked() {int index = (sLayout.currentIndex() + 1) % 3;sLayout.setCurrentIndex(index); }Widget::~Widget() {}main.cpp:
#include <QtGui/QApplication> #include "Widget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }參考資料:
總結
- 上一篇: 51单片机的中断系统
- 下一篇: Qt中的QBoxLayout