以下是一个基于QGraphicsView的放缩示例(使用鼠标滚轮):
#include <QtWidgets>
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
{
setRenderHint(QPainter::Antialiasing);
setDragMode(QGraphicsView::ScrollHandDrag);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
}
protected:
void wheelEvent(QWheelEvent *event) override
{
if (event->modifiers() & Qt::ControlModifier) {
double scaleFactor = 1.15;
if (event->angleDelta().y() < 0) {
scaleFactor = 1.0 / scaleFactor;
}
scale(scaleFactor, scaleFactor);
event->accept();
} else {
QGraphicsView::wheelEvent(event);
}
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene scene;
QGraphicsRectItem *rectItem = scene.addRect(QRectF(-50, -50, 100, 100), QPen(), QBrush(Qt::red));
QGraphicsTextItem *textItem = scene.addText("Hello, world!");
GraphicsView view;
view.setScene(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.show();
return app.exec();
}
在此示例中,我们重写了QGraphicsView的wheelEvent()函数,以便在按下Ctrl键时进行放缩。如果未按下Ctrl键,则调用父类实现。setScale()函数将引起视图的重新绘制,并且由于我们设置了setViewportUpdateMode(QGraphicsView::FullViewportUpdate),因此整个视图将被重新绘制。最后,我们创建了一个GraphicsView对象,并使用QGraphicsScene添加了两个项目:矩形和文本。