使用 QGraphicsView 平移缩放和旋转
QGraphics
可用于将可视对象的复杂场景组织到框架中,使其更易于处理。
在此框架 QGraphicsView , QGraphicsScene 和 QGraphicsItems 中使用了三种主要类型的对象。QGraphicsItems 是场景中存在的基本视觉项目。
有许多类型是预先构建的并且可以使用,例如椭圆 ,线 ,路径 , Pixmaps ,多边形 ,矩形和文本 。
你也可以通过继承 QGraphicsItem
来制作自己的物品。然后将这些物品放入 QGraphicsScene
,这基本上就是你计划看的世界。物品可以在场景中移动,就像让它们在你正在看的世界中移动一样。项目定位和方向由称为 QTransforms 的变换矩阵处理。Qt 内置了很好的功能,因此你通常不需要直接使用 QTransforms
,而是调用旋转或缩放等功能,为你创建适当的变换。然后通过 QGraphicsView
中定义的透视图(再次使用 QTransforms
)查看场景,这是你在 UI 中放入窗口小部件的部分。
在下面的示例中,有一个非常简单的场景,只有一个项目(像素图),它被放入场景并显示在视图中。通过打开 DragMode
标志,可以使用鼠标平移场景,通过使用缩放和旋转功能,可以使用鼠标滚动缩放场景并使用箭头键旋转。
如果你想运行此示例,请创建将显示的 View 实例,并使用包含图像 my_image.png 的前缀/ images 创建一个资源文件。
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QKeyEvent>
class View : public QGraphicsView
{
Q_OBJECT
public:
explicit View(QWidget *parent = 0) :
QGraphicsView(parent)
{
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap(":/images/my_image.png"));
pixmapItem->setTransformationMode(Qt::SmoothTransformation);
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);
setScene(scene);
}
protected Q_SLOTS:
void wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
scale(1.25, 1.25);
else
scale(0.8, 0.8);
}
void keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Left)
rotate(1);
else if(event->key() == Qt::Key_Right)
rotate(-1);
}
};