Qt中的布局管理器
文章目錄
- 1 Qt中的布局管理器
- 1.1 絕對(duì)定位存在的問(wèn)題
- 1.2 Qt中的布局管理器
- 1.3 布局管理器的注意事項(xiàng)
- 2 布局管理器綜合示例
1 Qt中的布局管理器
1.1 絕對(duì)定位存在的問(wèn)題
絕對(duì)定位直接在像素級(jí)指定各個(gè)組件的位置和大小:
- void QWidget::move(int x, int y)
- void QWidget::resize(int w, int h)
絕對(duì)定位存在的問(wèn)題:
- 組件的位置和大小無(wú)法自適應(yīng)父窗口的變化。
1.2 Qt中的布局管理器
布局管理器提供了相關(guān)的類對(duì)界面組件進(jìn)行布局管理:
- 能夠自動(dòng)排列窗口中的界面組件。
- 窗口變化后自動(dòng)更新界面組件的大小。
QLayout:
- QLayout是Qt中布局管理器的抽象基類。
- 通過(guò)繼承QLayout實(shí)現(xiàn)了功能各異且互補(bǔ)的布局管理器。
- Qt中可以根據(jù)需要自定義布局管理器。
- 布局管理器不是界面部件,而是界面部件的定位策略。
1.3 布局管理器的注意事項(xiàng)
對(duì)于布局管理器:
- 任意容器類的組件都可以指定布局管理器。
- 同一個(gè)布局管理器中的組件擁有相同的父組件。
- 設(shè)置布局管理器的同時(shí)隱式的指定了父子關(guān)系。
組件1和組件2的父組件均為QWidget對(duì)應(yīng)的對(duì)象。
2 布局管理器綜合示例
需求分析:練習(xí)開(kāi)發(fā)一個(gè)向?qū)в脩艚缑?/p>
- 在同一個(gè)界面上展現(xiàn)不同的向?qū)ы?yè)面。
- 通過(guò)“上一步”和“下一步”按鈕進(jìn)行切換。
- 不同頁(yè)面上的元素組件和組件排布都不相同。
- 頁(yè)面中的組件通過(guò)布局管理器進(jìn)行排布。
通過(guò)布局嵌套進(jìn)行界面設(shè)計(jì):
通過(guò)QStackedLayout管理不同的頁(yè)面:
通過(guò)子組件的方式生成不同的頁(yè)面:
示例代碼如下:
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(); }參考資料:
總結(jié)
- 上一篇: 51单片机的中断系统
- 下一篇: Qt中的QBoxLayout