gpt4 book ai didi

c++ - 如何使用 Qt 防止 QCursor::setPos() 上的 mouseMoveEvent?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:11 30 4
gpt4 key购买 nike

我目前正在开发图像查看器应用程序。在这个应用程序中,我有一个所谓的“pan-zoom”功能。这意味着,当按住某个鼠标按钮时,用户可以通过前后平移来缩放图像。

它工作正常,但随着使用该功能,鼠标(自然地)在屏幕上上下移动,并会在某个点到达屏幕边界,这将使其停止。相反,我想要一种鼠标保持静止并且只有图像放大率发生变化的行为。

我试图通过在 QWidget::mouseMoveEvent 中调用 QCursor::setPos 并在处理完移动后将鼠标重置到初始位置来实现这一点。它的工作原理是鼠标几乎保持静止(它来回摆动)。但是,这将导致再次调用鼠标移动事件,从而有效地取消我刚刚所做的调整。这将导致“摆动”效果。每一次调整都会立即被撤销。

这里是一段代码,所以你可以了解我在做什么:

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()));
}
}

有没有办法在使用QCursor::setPos时阻止鼠标移动事件的发生?

最佳答案

假设您没有调用基类 mouseMoveEvent,您应该 accept the event将其标记为正在处理。默认情况下,当您重新实现该事件时,它们会被接受,但明确表示会更清楚。调用 e->accept()

还建议如果您处理任何鼠标事件,you should handle all ,鼠标双击可能是个异常(exception)。

这是一个保持鼠标静止不动的例子,尽管在 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
};

如果您不介意保持鼠标静止不动,取消QCursor::setPos 调用,当鼠标按钮位于小部件外时,它仍会接收移动事件按住。

不过,这可能是更好的用户体验hiding the cursor缩放时。

关于c++ - 如何使用 Qt 防止 QCursor::setPos() 上的 mouseMoveEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33652330/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com