QGraphicsItemGroup 类
QGraphicsItemGroup类提供了一个容器,该容器将一组项目视为一个项目。
Header: | #include < QGraphicsItemGroup > |
---|---|
qmake: | QT += widgets |
Inherits: | QGraphicsItem |
Inherited By: | |
Since: | Qt 4.2 |
详述
QGraphicsItemGroup是复合项目的一种特殊类型,它将自身及其所有子项视为一个项(即,所有子项的所有事件和几何都合并在一起)。当用户希望将几个较小的项目分组为一个大项目时,通常在演示工具中使用项目组,以简化项目的移动和复制。
如果只需要将项目存储在其他项目中,则任何QGraphicsItem可以通过将合适的父级传递给setParentItem() 来实现。
QGraphicsItemGroup的boundingRect() 函数返回项目组中所有项目的边界矩形。 QGraphicsItemGroup忽略其子项上的ItemIgnoresTransformations标志(即,相对于组项的几何形状,将子项视为可变形的)。
有两种构造项目组的方法。最简单,最常见的方法是将项目列表(例如,所有选定的项目)传递给QGraphicsScene :: createItemGroup() ,后者将返回一个新的QGraphicsItemGroup项目。另一种方法是手动构造QGraphicsItemGroup项,将其添加到调用QGraphicsScene :: addItem() 的场景中,然后通过调用addToGroup() 一次将项手动添加到组中。要拆除(“取消分组”)项目组,可以调用QGraphicsScene :: destroyItemGroup() ,也可以通过调用removeFromGroup() 手动从该组中删除所有项目。
// Group all selected items together
QGraphicsItemGroup *group = scene->createItemGroup(scene->selecteditems());
// Destroy the group, and delete the group item
scene->destroyItemGroup(group);
与调用setParentItem() (仅保留子项的父项相对位置和转换)相反,添加和删除项的操作将保留项的场景相对位置和转换。
addtoGroup() 函数将目标项目重新添加到该项目组,从而保持项目相对于场景的位置和变换完整无缺。 从视觉上看,这意味着通过addToGroup() 添加的项目将由于此操作而保持完全不变,而不管该项目或组的当前位置或转换如何。 尽管商品的位置和矩阵可能会发生变化。
removeFromGroup() 函数的语义与setParentItem() 相似; 它将项目重定为项目组的父项目。 与addToGroup() 一样,项目的场景相对位置和变换保持不变。
参见QGraphicsItem和图形视图框架。
公共类型
enum anonymous
由virtual type()函数返回的值。
Constant | Value | Description |
---|---|---|
Type | 10 | 图形组 |
公共函数
构造析构
- QGraphicsItemGroup(QGraphicsItem *parent = nullptr)
- virtual ~QGraphicsItemGroup()
添加删除项目
- void addToGroup(QGraphicsItem *item)
- void removeFromGroup(QGraphicsItem *item)
重写的公共函数
- virtual QRectF boundingRect() const override
- virtual bool isObscuredBy(const QGraphicsItem *item) const override
- virtual QPainterPath opaqueArea() const override
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override
- virtual int type() const override
演示代码
#include <QtWidgets>
class MyItemLine :public QGraphicsLineItem{
public:
MyItemLine(qreal x,qreal y,qreal x1,qreal y1)
:QGraphicsLineItem(x,y,x1,y1){};
~MyItemLine(){
qDebug() << "~MyItemLine()";
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setApplicationName ("图形框架");
a.setFont(QFont("楷体"));
QGraphicsView view;
QGraphicsScene scene(-100,-100,200,200);
scene.setBackgroundBrush (QBrush(qRgb (173,241,174)));
QPen pen(qRgb (140,159,141));
for (int i = -80; i < 100; i+=20) {
scene.addLine (-100,i,100,i,pen);
scene.addLine (i,-100,i,100,pen);
}
QGraphicsItemGroup xAxis;
scene.addItem (&xAxis);
xAxis.addToGroup (scene.addLine (-100,0,100,0));
xAxis.addToGroup (scene.addLine (90,-10,100,-1));
xAxis.addToGroup (scene.addLine (90, 10,100, 1));
xAxis.setFlag (QGraphicsItem::ItemIsMovable);
QGraphicsItemGroup yAxis;
scene.addItem (&yAxis);
yAxis.setFlag (QGraphicsItem::ItemIsMovable);
yAxis.addToGroup (new MyItemLine(0,-100,0,100));
yAxis.addToGroup (new MyItemLine(-1, 100,-10,90));
yAxis.addToGroup (new MyItemLine(1 , 100, 10,90));
QGraphicsLineItem li;
li.setLine (-40,-30,65,40);
pen.setColor (Qt::black);
pen.setStyle (Qt::DashDotDotLine);
pen.setWidthF (2);
li.setPen (pen);
li.setFlag (QGraphicsItem::ItemIsMovable);
scene.addItem (&li);
qDebug() << scene.children ();
view.setScene (&scene);
view.setRenderHint (QPainter::Antialiasing);
view.setWindowFlag (Qt::WindowMinMaxButtonsHint,false);
view.show ();
return a.exec();
}