热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qt流式布局

当我们希望控件会随着窗口大小的变化,自动填充布局,例如:这时候,就需要用到流式布局了,但是Qt官方没有吧流式布

当我们希望控件会随着窗口大小的变化,自动填充布局,例如:
请添加图片描述
这时候,就需要用到流式布局了,但是Qt官方没有吧流式布局集成到IDE中,如果需要的话,可查阅官方案例:https://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-example.html
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
直接把源码copy到自己新建的类中即可使用,源码如下:

#ifndef FLOWLAYOUT_H
#define FLOWLAYOUT_H#include
#include
#include
class FlowLayout : public QLayout
{
public:explicit FlowLayout(QWidget *parent, int margin &#61; -1, int hSpacing &#61; -1, int vSpacing &#61; -1);explicit FlowLayout(int margin &#61; -1, int hSpacing &#61; -1, int vSpacing &#61; -1);~FlowLayout();void addItem(QLayoutItem *item) override;int horizontalSpacing() const;int verticalSpacing() const;Qt::Orientations expandingDirections() const override;bool hasHeightForWidth() const override;int heightForWidth(int) const override;int count() const override;QLayoutItem *itemAt(int index) const override;QSize minimumSize() const override;void setGeometry(const QRect &rect) override;QSize sizeHint() const override;QLayoutItem *takeAt(int index) override;private:int doLayout(const QRect &rect, bool testOnly) const;int smartSpacing(QStyle::PixelMetric pm) const;QList<QLayoutItem *> itemList;int m_hSpace;int m_vSpace;
};#endif // FLOWLAYOUT_H

#include #include "flowlayout.h"
FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing): QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
{setContentsMargins(margin, margin, margin, margin);
}FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing): m_hSpace(hSpacing), m_vSpace(vSpacing)
{setContentsMargins(margin, margin, margin, margin);
}FlowLayout::~FlowLayout()
{QLayoutItem *item;while ((item &#61; takeAt(0)))delete item;
}void FlowLayout::addItem(QLayoutItem *item)
{itemList.append(item);
}int FlowLayout::horizontalSpacing() const
{if (m_hSpace >&#61; 0) {return m_hSpace;} else {return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);}
}int FlowLayout::verticalSpacing() const
{if (m_vSpace >&#61; 0) {return m_vSpace;} else {return smartSpacing(QStyle::PM_LayoutVerticalSpacing);}
}int FlowLayout::count() const
{return itemList.size();
}QLayoutItem *FlowLayout::itemAt(int index) const
{return itemList.value(index);
}QLayoutItem *FlowLayout::takeAt(int index)
{if (index >&#61; 0 && index < itemList.size())return itemList.takeAt(index);elsereturn 0;
}Qt::Orientations FlowLayout::expandingDirections() const
{return 0;
}bool FlowLayout::hasHeightForWidth() const
{return true;
}int FlowLayout::heightForWidth(int width) const
{int height &#61; doLayout(QRect(0, 0, width, 0), true);return height;
}void FlowLayout::setGeometry(const QRect &rect)
{QLayout::setGeometry(rect);doLayout(rect, false);
}QSize FlowLayout::sizeHint() const
{return minimumSize();
}QSize FlowLayout::minimumSize() const
{QSize size;QLayoutItem *item;foreach (item, itemList)size &#61; size.expandedTo(item->minimumSize());size &#43;&#61; QSize(2*margin(), 2*margin());return size;
}int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
{int left, top, right, bottom;getContentsMargins(&left, &top, &right, &bottom);QRect effectiveRect &#61; rect.adjusted(&#43;left, &#43;top, -right, -bottom);int x &#61; effectiveRect.x();int y &#61; effectiveRect.y();int lineHeight &#61; 0;QLayoutItem *item;foreach (item, itemList) {QWidget *wid &#61; item->widget();int spaceX &#61; horizontalSpacing();if (spaceX &#61;&#61; -1)spaceX &#61; wid->style()->layoutSpacing(QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);int spaceY &#61; verticalSpacing();if (spaceY &#61;&#61; -1)spaceY &#61; wid->style()->layoutSpacing(QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);int nextX &#61; x &#43; item->sizeHint().width() &#43; spaceX;if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {x &#61; effectiveRect.x();y &#61; y &#43; lineHeight &#43; spaceY;nextX &#61; x &#43; item->sizeHint().width() &#43; spaceX;lineHeight &#61; 0;}if (!testOnly)item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));x &#61; nextX;lineHeight &#61; qMax(lineHeight, item->sizeHint().height());}return y &#43; lineHeight - rect.y() &#43; bottom;
}
int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
{QObject *parent &#61; this->parent();if (!parent) {return -1;} else if (parent->isWidgetType()) {QWidget *pw &#61; static_cast<QWidget *>(parent);return pw->style()->pixelMetric(pm, 0, pw);} else {return static_cast<QLayout *>(parent)->spacing();}
}

推荐阅读
author-avatar
changless
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有