bwe*_*ber 5 c++ qt mouse-position qcursor
我目前正在开发图像查看器应用程序。在此应用程序中,我有一个所谓的“平移缩放”功能。这意味着,当按住某个鼠标按钮时,用户可以通过前后平移来缩放图像。
它工作正常,但随着该功能的使用,鼠标(自然地)在屏幕上上下移动,并在某个时刻到达屏幕边框,这将使其停止。相反,我想要一种鼠标保持静止并且仅图像放大倍数发生变化的行为。
我尝试通过调用QCursor::setPos
内部来实现此目的QWidget::mouseMoveEvent
,并在处理移动后将鼠标重置到初始位置。只要鼠标几乎保持静止(前后摆动),它就可以工作。但是,这将导致再次调用鼠标移动事件,从而有效地取消我刚刚所做的调整。这将导致“摆动”效果。每一次调整都会立即逆转。
这是一个代码片段,这样您就可以了解我在做什么:
void ImageView::mouseMoveEvent(QMouseEvent *e) {
//some code
if (_panZooming) {
//some code here
//doesn't work as expected because it invokes this event again
QCursor::setPos(mapToGlobal(_initialMousePosition.toPoint()));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法防止使用时发生鼠标移动事件QCursor::setPos
?
假设您没有调用基类mouseMoveEvent
,您应该接受该事件以将其标记为正在处理。默认情况下,当您重新实现事件时,它们会被接受,但明确起来会更清楚。称呼e->accept( )
。
还建议如果您处理任何鼠标事件,则应处理所有事件,鼠标双击可能除外。
下面是保持鼠标静止的示例,尽管在 OS X 上偶尔会出现闪烁,这似乎是由于 Qt 处理事件的方式造成的
class MyWidget : public QWidget
{
void mousePressEvent(QMouseEvent* e)
{
m_pos = e->globalPos();
m_lastPos = m_pos;
QWidget::mousePressEvent(e);
}
void mouseMoveEvent(QMouseEvent* e)
{
// Calculate relative zoom factor
// scaled down ( / 10 ) for image zooming
m_zoomFactor += ((float)e->globalPos().y() - m_lastPos.y()) / 10;
QCursor::setPos(m_pos);
m_lastPos = m_pos;
e->accept();
qDebug() << m_zoomFactor << endl;
}
void mouseReleaseEvent(QMouseEvent* e)
{
QWidget::mouseReleaseEvent(e);
}
private:
QPoint m_pos;
QPoint m_lastPos;
float m_zoomFactor = 0; // C++ 11 initialisation
};
Run Code Online (Sandbox Code Playgroud)
如果您不介意保持鼠标静止,请取消调用QCursor::setPos
,当光标位于小部件之外且按住鼠标按钮时,它仍然会接收移动事件。
然而,缩放时隐藏光标可能会带来更好的用户体验。