Qt中有些功能很相似的类,下面整理汇总:
这几个Group结尾的类都是对某个对象进行分组管理,功能很类似。
QActionGroup类用来将菜单中的子菜单(QAction)分组。具体参见《QActionGroup类使用》。
QButtonGroup用于对多个按钮分组管理。具体参见《Qt 中QButtonGroup 的用法》、《QButtonGroup用法》。
QGraphicsItemGroup用于视图场景中的QGraphicsItem项进行分组管理。
常用的软件,例如: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处理自己的事件。
有两种使用 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 桥接方便,不应将其用于高性能场景。
这个就不说了,学Qt的都应该对这个类很熟练了。
.QLayout或QLayout子类及QGraphicsLayout或QGraphicsLayout子类有类似功能。.QLayout或QLayout子类是对QWidget、QLayoutItem进行布局;QGraphicsLayout或QGraphicsLayout子类有是对QGraphicsLayoutItem、QGraphicsItem进行布局。