zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之自定义布局管理器(QBorderLayout)

Qt 自定义 布局 管理器
2023-09-11 14:19:16 时间
QBorderLayout主要采用QLayout和QWidgetItem实现,而窗口使用了QWidget,中央窗体使用QTextBrowser,四周以QLabel排列。

QBorderLayout主要采用QLayout和QWidgetItem实现,而窗口使用了QWidget,中央窗体使用QTextBrowser,四周以QLabel排列。


explicit QBorderLayout(QWidget *parent, int margin = 0, int spacing = -1); QBorderLayout(int spacing = -1); ~QBorderLayout(); void addItem(QLayoutItem *item) Q_DECL_OVERRIDE; void addWidget(QWidget *widget, Position position); Qt::Orientations expandingDirections() const Q_DECL_OVERRIDE; bool hasHeightForWidth() const Q_DECL_OVERRIDE; int count() const Q_DECL_OVERRIDE; QLayoutItem *itemAt(int index) const Q_DECL_OVERRIDE; QSize minimumSize() const Q_DECL_OVERRIDE; void setGeometry(const QRect rect) Q_DECL_OVERRIDE; QSize sizeHint() const Q_DECL_OVERRIDE; QLayoutItem *takeAt(int index) Q_DECL_OVERRIDE; void add(QLayoutItem *item, Position position); private: struct ItemWrapper ItemWrapper(QLayoutItem *i, Position p) { item = i; position = p; QLayoutItem *item; Position position; enum SizeType { MinimumSize, SizeHint }; QSize calculateSize(SizeType sizeType) const; QList ItemWrapper * list; #endif // QBORDERLAYOUT_H

QBorderLayout.cpp


QBorderLayout::QBorderLayout(QWidget *parent, int margin, int spacing) : QLayout(parent) setMargin(margin); setSpacing(spacing); QBorderLayout::QBorderLayout(int spacing) setSpacing(spacing); QBorderLayout::~QBorderLayout() QLayoutItem *l; while ((l = takeAt(0))) delete l; void QBorderLayout::addItem(QLayoutItem *item) add(item, West); void QBorderLayout::addWidget(QWidget *widget, Position position) add(new QWidgetItem(widget), position); Qt::Orientations QBorderLayout::expandingDirections() const return Qt::Horizontal | Qt::Vertical; bool QBorderLayout::hasHeightForWidth() const return false; int QBorderLayout::count() const return list.size(); QLayoutItem *QBorderLayout::itemAt(int index) const ItemWrapper *wrapper = list.value(index); if (wrapper) return wrapper- item; else return 0; QSize QBorderLayout::minimumSize() const return calculateSize(MinimumSize); void QBorderLayout::setGeometry(const QRect rect) ItemWrapper *center = 0; int eastWidth = 0; int westWidth = 0; int northHeight = 0; int southHeight = 0; int centerHeight = 0; int i; QLayout::setGeometry(rect); for (i = 0; i list.size(); ++i) { ItemWrapper *wrapper = list.at(i); QLayoutItem *item = wrapper- item; Position position = wrapper- position; if (position == North) { item- setGeometry(QRect(rect.x(), northHeight, rect.width(), item- sizeHint().height())); northHeight += item- geometry().height() + spacing(); } else if (position == South) { item- setGeometry(QRect(item- geometry().x(), item- geometry().y(), rect.width(), item- sizeHint().height())); southHeight += item- geometry().height() + spacing(); item- setGeometry(QRect(rect.x(), rect.y() + rect.height() - southHeight + spacing(), item- geometry().width(), item- geometry().height())); } else if (position == Center) { center = wrapper; centerHeight = rect.height() - northHeight - southHeight; for (i = 0; i list.size(); ++i) { ItemWrapper *wrapper = list.at(i); QLayoutItem *item = wrapper- item; Position position = wrapper- position; if (position == West) { item- setGeometry(QRect(rect.x() + westWidth, northHeight, item- sizeHint().width(), centerHeight)); westWidth += item- geometry().width() + spacing(); } else if (position == East) { item- setGeometry(QRect(item- geometry().x(), item- geometry().y(), item- sizeHint().width(), centerHeight)); eastWidth += item- geometry().width() + spacing(); item- setGeometry(QRect( rect.x() + rect.width() - eastWidth + spacing(), northHeight, item- geometry().width(), item- geometry().height())); if (center) center- item- setGeometry(QRect(westWidth, northHeight, rect.width() - eastWidth - westWidth, centerHeight)); QSize QBorderLayout::sizeHint() const return calculateSize(SizeHint); QLayoutItem *QBorderLayout::takeAt(int index) if (index = 0 index list.size()) { ItemWrapper *layoutStruct = list.takeAt(index); return layoutStruct- item; return 0; void QBorderLayout::add(QLayoutItem *item, Position position) list.append(new ItemWrapper(item, position)); QSize QBorderLayout::calculateSize(SizeType sizeType) const QSize totalSize; for (int i = 0; i list.size(); ++i) { ItemWrapper *wrapper = list.at(i); Position position = wrapper- position; QSize itemSize; if (sizeType == MinimumSize) itemSize = wrapper- item- minimumSize(); else // (sizeType == SizeHint) itemSize = wrapper- item- sizeHint(); if (position == North || position == South || position == Center) totalSize.rheight() += itemSize.height(); if (position == West || position == East || position == Center) totalSize.rwidth() += itemSize.width(); return totalSize; }
QTextBrowser *pCentralWidget = new QTextBrowser(this);

pCentralWidget- setPlainText(tr("Central Widget"));

QBorderLayout *pLayout = new QBorderLayout();

pLayout- addWidget(pCentralWidget, QBorderLayout::Center);

pLayout- addWidget(createLabel("North"), QBorderLayout::North);

pLayout- addWidget(createLabel("West"), QBorderLayout::West);

pLayout- addWidget(createLabel("East 1"), QBorderLayout::East);

pLayout- addWidget(createLabel("East 2") , QBorderLayout::East);

pLayout- addWidget(createLabel("South"), QBorderLayout::South);

setLayout(pLayout);

QLabel *MainWindow::createLabel(const QString text)

 QLabel *pLabel = new QLabel(this);

 pLabel- setText(text);

 pLabel- setFrameStyle(QFrame::Box | QFrame::Raised);

 return pLabel;

}

C/C++ Qt 自定义Dialog对话框组件应用 在上一篇博文 `《C/C++ Qt 标准Dialog对话框组件应用》` 中我给大家演示了如何使用Qt中内置的标准对话框组件实现基本的数据输入功能。
C/C++ Qt MdiArea 多窗体组件应用 MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。
C/C++ Qt ListWidget 列表框组件应用 ListWidget列表框组件,该组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget组件则只能实现单字段结构,ListWidget组件常用于显示单条记录,例如只显示IP地址,用户名等数据,如下笔记是本人在开发中经常用到的一些基本操作技巧,包括列表框组件的基本操作方法。
QT TextEdit控件 全面详解 本文详细的介绍了TextEdit控件的各种操作,例如:获取内容、输入控件字符、保持在最后一行添加(自动滚屏)、定时关闭、添加数据换行、向鼠标位置插入一行字符、设置字体颜色属性等操作。 本系列QT全面详解文章目前共有十五篇,本系列文章较为详细的讲述了QT控件的基础操作和使用,也谢谢大家的关注、点赞、收藏。