Qt中有些功能很相似的类,下面整理汇总:
1.QActionGroup、QButtonGroup、QGraphicsItemGroup
这几个Group结尾的类都是对某个对象进行分组管理,功能很类似。
1.1.QActionGroup
QActionGroup类用来将菜单中的子菜单(QAction)分组。具体参见《QActionGroup类使用》。
1.2.QButtonGroup
QButtonGroup用于对多个按钮分组管理。具体参见《Qt 中QButtonGroup 的用法》、《QButtonGroup用法》。
1.3.QGraphicsItemGroup
QGraphicsItemGroup用于视图场景中的QGraphicsItem项进行分组管理。
- QGraphicsItemGroup 是一种特殊类型的复合项,它将自身及其所有子项视为一个项(即所有子项的所有事件和几何图形都合并在一起)。当想要将几个较小的图形项组合成一个大图形项以简化项目的移动和复制时可以使用项目组。
- 如果只想将图形项存储在其他图形项中,应该通过将合适的父项传递给 setParentItem() 来直接使用任何 QGraphicsItem而不是使用QGraphicsItemGroup。
- QGraphicsItemGroup 的 boundingRect() 函数返回项组中所有项的边界矩形。 QGraphicsItemGroup 忽略其子项上的 ItemIgnoresTransformations 标志(图形项将忽略继承的转换)。
- 将项目列表传递给 QGraphicsScene::createItemGroup((const QList<QGraphicsItem *> &items),它返回一个新的 QGraphicsItemGroup 图形项。
- 构造一个 QGraphicsItemGroup 项,调用 QGraphicsScene::addItem() 将其添加到场景中,然后通过调用 addToGroup() 将项目添加到组中。
- 要拆除(“取消分组”)一个项目组,可以调用 QGraphicsScene::destroyItemGroup(),或者调用 removeFromGroup() 从组中删除所有项目。
示例
常用的软件,例如:XMind、Visio 都有分组功能。下面,我们实现一个简单的分组,利用一个直线(链接线)将椭圆和矩形连接起来。

源码如下:
// 构造 group、椭圆、直线、矩形
QGraphicsItemGroup *pGroup = new QGraphicsItemGroup();
QGraphicsEllipseItem *pFrom = new QGraphicsEllipseItem();
QGraphicsLineItem *pLink = new QGraphicsLineItem();
QGraphicsRectItem *pTo = new QGraphicsRectItem();
// 设置 group 可选中、可移动
pGroup->setFlags( QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
// 设置样式(画笔 - 边框色 画刷 - 背景色)
QPen pen = pFrom->pen();
pen.setWidth(2);
pen.setColor(QColor(0, 160, 230));
pFrom->setPen(pen);
pLink->setPen(pen);
pTo->setPen(pen);
pFrom->setBrush(QColor(247, 160, 57));
pTo->setBrush(QColor(247, 160, 57));
// 将 item 添加至 group
pGroup->addToGroup(pFrom);
pGroup->addToGroup(pTo);
pGroup->addToGroup(pLink);
// 设置椭圆、矩形区域
const double length = 50;
pFrom->setRect(QRectF(-length/2.0, -length/2.0, length, length));
pTo->setRect(QRectF(-length/2.0, -length/2.0, length, length));
// 设置椭圆、矩形、连接线坐标
pFrom->setPos(80, 80);
pTo->setPos(200, 150);
pLink->setLine(QLineF(pFrom->pos(), pTo->pos()));
// 将 group 添加至场景中
QGraphicsScene *pScene = new QGraphicsScene();
pScene->setSceneRect(0, 0, 300, 200);
pScene->addItem(pGroup);
// 为视图设置场景
QGraphicsView *pView = new QGraphicsView();
pView->setRenderHint(QPainter::Antialiasing);
pView->setScene(pScene);
pView->show();
注意: QGraphicsItem 分组比较简单,但在分组之后 group 中的 QGraphicsItem 无法捕获自己的相关事件(例如:鼠标事件、键盘事件),实际接受消息对象为 QGraphicsItemGroup。处理方式请参见:让QGraphicsItemGroup中的item处理自己的事件。
2.QGraphicsProxyWidget、QWidget
2.1.QGraphicsProxyWidget
- QGraphicsProxyWidget 类提供了一个代理层,用于在 QGraphicsScene 中嵌入 QWidget。
- QGraphicsProxyWidget 在两个对象之间转发事件,并在 QWidget 的基于 int 的几何坐标和 QGraphicsWidget 的基于 qreal 的几何坐标之间进行转换。
- QGraphicsProxyWidget 支持 QWidget 的几乎所有核心功能,包括Tab切换焦点、键盘输入、拖放和弹出窗口等。
- QGraphicsProxyWidget 通过为每个弹出窗口创建子代理来处理嵌入式小部件的弹出窗口子项。这意味着当嵌入的 QComboBox 显示其弹出列表时,会自动创建一个新的 QGraphicsProxyWidget,嵌入弹出窗口并正确定位。
有两种使用 QGraphicsProxyWidget 嵌入小部件的方法:
1、将小部件指针与任何相关的 Qt::WindowFlags 一起传递给 QGraphicsScene::addWidget()。此函数返回一个指向 QGraphicsProxyWidget 的指针。例:
QGroupBox *groupBox = new QGroupBox("group");
QLabel *numberLabel = new QLabel("lable");
QLineEdit *numberEdit = new QLineEdit;
QFormLayout *layout = new QFormLayout;
layout->addRow(numberLabel, numberEdit);
groupBox->setLayout(layout);
QGraphicsProxyWidget *proxy = gphs->addWidget(groupBox);
proxy->setPos(100,100);
2、创建一个 QGraphicsProxyWidget 项,然后调用 setWidget() 来嵌入QWidget。widget() 函数返回一个指向嵌入小部件的指针。QGraphicsProxyWidget 与 QWidget 共享所有权,因此两者中的任何一个被销毁,另一也将自动销毁。
QGroupBox *groupBox = new QGroupBox("group");
QLabel *numberLabel = new QLabel("lable");
QLineEdit *numberEdit = new QLineEdit;
QFormLayout *layout = new QFormLayout;
layout->addRow(numberLabel, numberEdit);
groupBox->setLayout(layout);
QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget;
proxy->setWidget(groupBox);
gphs->addItem(proxy);
proxy->setPos(100,100);
1、2两种方法运行结果如下:

QGraphicsProxyWidget 保持其状态与嵌入的小部件同步。例如,如果代理被隐藏或禁用,则嵌入的小部件也将被隐藏或禁用,反之亦然。
注意事项
1、场景将嵌入的小部件保持在特殊状态,以防止它在嵌入小部件时干扰其他小部件。在这种状态下,小部件的行为可能与未嵌入时的行为略有不同。
2、提供此类是为了 QWidgets 和 QGraphicsItems 桥接方便,不应将其用于高性能场景。
2.2.QWidget
这个就不说了,学Qt的都应该对这个类很熟练了。
3.QLayout、QGraphicsLayout
.QLayout或QLayout子类及QGraphicsLayout或QGraphicsLayout子类有类似功能。.QLayout或QLayout子类是对QWidget、QLayoutItem进行布局;QGraphicsLayout或QGraphicsLayout子类有是对QGraphicsLayoutItem、QGraphicsItem进行布局。
4. QWidget::event和QGraphicsItem::sceneEvent
前者是对发向QWidget中的所有事件进行处理的函数,后者是对发向场景/视图/项框架中的项中的事件进行处理的函数。它们都可以在该函数对发向自己的事件如:鼠标事件、关闭事件、键盘事件、显示隐藏事件、手势事件等Qt中的各种事件进行处理。
本文详细介绍了Qt中几种Group类的功能和用法,包括QActionGroup、QButtonGroup和QGraphicsItemGroup。同时对比了QGraphicsProxyWidget和QWidget的使用,并讨论了QLayout与QGraphicsLayout的区别。
5584

被折叠的 条评论
为什么被折叠?



