QGraphicsScene 画一个不可变形的圆
QGraphicsScene draw a non transformable circle
我正在尝试在锚定在中心的 QGraphicsScene 上绘制一个 10 像素半径的圆,并且在缩放场景时不会变换(更改大小)。
我已经尝试使用带有 QGraphicsItem::ItemIgnoresTransformations 标志的 QGraphicsEllipseItem,但是当场景被缩放时它仍然会变形。
标准图形项目是否可行,或者我是否需要创建自己的图形项目并手动执行绘制事件?
以下代码可以满足我认为您正在寻找的内容。它创建一个 10 像素的不可变圆圈,将自身锚定到场景的中心,以及 10 个更大的、可移动的圆圈,这些圆圈遵循应用的缩放变换...
#include <iostream>
#include <QApplication>
#include <QGraphicsEllipseItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPainter>
int main (int argc, char **argv)
{
QApplication app(argc, argv);
QGraphicsView view;
QGraphicsScene scene;
view.setScene(&scene);
QGraphicsEllipseItem immutable(0, 0, 20, 20);
immutable.setFlag(QGraphicsItem::ItemIgnoresTransformations);
immutable.setPen(Qt::NoPen);
immutable.setBrush(Qt::blue);
scene.addItem(&immutable);
QObject::connect(&scene, &QGraphicsScene::sceneRectChanged,
[&](const QRectF &rect)
{
immutable.setPos(rect.center() - 0.5 * immutable.boundingRect().center());
});
for (int i = 0; i < 10; ++i) {
auto *e = new QGraphicsEllipseItem(20, 20, 50, 50);
e->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
scene.addItem(e);
}
view.show();
view.setTransform(QTransform::fromScale(5, 2));
return app.exec();
}
我正在尝试在锚定在中心的 QGraphicsScene 上绘制一个 10 像素半径的圆,并且在缩放场景时不会变换(更改大小)。
我已经尝试使用带有 QGraphicsItem::ItemIgnoresTransformations 标志的 QGraphicsEllipseItem,但是当场景被缩放时它仍然会变形。
标准图形项目是否可行,或者我是否需要创建自己的图形项目并手动执行绘制事件?
以下代码可以满足我认为您正在寻找的内容。它创建一个 10 像素的不可变圆圈,将自身锚定到场景的中心,以及 10 个更大的、可移动的圆圈,这些圆圈遵循应用的缩放变换...
#include <iostream>
#include <QApplication>
#include <QGraphicsEllipseItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPainter>
int main (int argc, char **argv)
{
QApplication app(argc, argv);
QGraphicsView view;
QGraphicsScene scene;
view.setScene(&scene);
QGraphicsEllipseItem immutable(0, 0, 20, 20);
immutable.setFlag(QGraphicsItem::ItemIgnoresTransformations);
immutable.setPen(Qt::NoPen);
immutable.setBrush(Qt::blue);
scene.addItem(&immutable);
QObject::connect(&scene, &QGraphicsScene::sceneRectChanged,
[&](const QRectF &rect)
{
immutable.setPos(rect.center() - 0.5 * immutable.boundingRect().center());
});
for (int i = 0; i < 10; ++i) {
auto *e = new QGraphicsEllipseItem(20, 20, 50, 50);
e->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
scene.addItem(e);
}
view.show();
view.setTransform(QTransform::fromScale(5, 2));
return app.exec();
}