我正在尝试将放大/缩小功能添加到我在Qt中绘制的图形中。 我最初做的是使用我自己的类GraphicsScene扩展QGraphicsScene并重载wheel事件。
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
GraphicsScene(QObject *parent, bool drawAxes){ /*drawing stuff here.. */}
virtual void wheelEvent(QGraphicsSceneWheelEvent *mouseEvent);
signals:
void mouseWheelTurned(int);
};
void GraphicsScene::wheelEvent(QGraphicsSceneWheelEvent* mouseEvent) {
int numDegrees = mouseEvent->delta() / 8;
int numSteps = numDegrees / 15; // see QWheelEvent documentation
emit mouseWheelTurned(numSteps);
}
转动滚轮时,会向包含场景的视图发送一个事件,并执行缩放:
class GraphicsView : public QGraphicsView{
Q_OBJECT
qreal m_currentScale;
public:
GraphicsView(QWidget * parent): QGraphicsView(parent){ m_currentScale = 1.0; }
public slots:
void onMouseWheelTurned (int);
};
void GraphicsView::onMouseWheelTurned(int steps) {
qreal sign = steps>0?1:-1;
qreal current = sign* pow(0.05, abs(steps));
if(m_currentScale+current > 0){
m_currentScale += current;
QMatrix matrix;
matrix.scale(m_currentScale, m_currentScale);
this->setMatrix(matrix);
}
}
这很有效,但我注意到如果我放大很多,例如放大到图形的顶部,这样图形就不再完全在视口中,然后我缩小,程序首先滚动到底部图形。我可以看到垂直滚动条向下滑动。只有当它到达底部时,它才会开始缩小。可能是什么问题呢?
如果没有这种向上/向下滚动行为,我想放大/缩小。