【问题标题】:Qt Mouse Control of Rotaries on touch and non-touch devices触摸和非触摸设备上的 Qt 鼠标控制旋转
【发布时间】:2013-04-19 09:45:18
【问题描述】:

我已经在 Qt 中实现了旋转小部件。当用户点击旋转时,鼠标光标被隐藏,鼠标左/下拖动旋转旋转逆时针,鼠标右/上拖动旋转旋转顺时针。释放鼠标时,鼠标光标设置为单击的原始位置。像这样实现:

void RotaryWidget::mousePressEvent(QMouseEvent *MouseEvent)
{
    mMousePos = QCursor::pos();
    mPreviousPos = MouseEvent->pos();
    setCursor(Qt::BlankCursor);
}

void RotaryWidget::mouseReleaseEvent(QMouseEvent *MouseEvent)
{
    QCursor::setPos(mMousePos);
    unsetCursor();
}

void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
    QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
    // Use DeltaPos to move my rotary
    mPreviousPos = MouseEvent->pos();
}

这样做的好处是,当连续有几个旋转时,用户可以更快地进行调整。

上面的代码有一个错误,如果光标到达屏幕边缘,鼠标不能移动,所以旋转器不会移动。但是,用户看不到光标,所以这是个问题。我更改了mouseMoveEvent 来修复它:

void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
    if(MouseEvent->globalPos() == mMousePos)
    {
        mPreviousPos = mapFromGlobal(mMousePos);
        return;
    }
    else
    {
        QCursor::setPos(mMousePos);
    }
    QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
    // Use DeltaPos to move my rotary
    mPreviousPos = MouseEvent->pos();
}

本质上,每次移动鼠标,都会计算变化,然后将光标设置回原来的按下位置(因此它永远不会离开屏幕)。顶部的if 确保我们不会一遍又一遍地将鼠标位置设置为原始位置。

这在非触摸屏设备上运行良好,但在触摸屏设备上,QCursor::setPos() 不起作用,因为我无法以编程方式设置手指在屏幕上的位置!

我想不出一个能满足我所描述的所有要求的解决方案。如果有办法检测用户是否在使用触摸屏,它可以被修复,但我在 Qt 中找不到这样的功能。

【问题讨论】:

  • 当用户移动并一直触摸屏幕边缘时,它应该如何表现?转盘一直在转动吗??
  • @UmNyobe 在触摸屏设备上,如果他们到达屏幕边缘,旋转将不再移动。在非触摸屏设备上,他们永远无法到达屏幕边缘。

标签: c++ qt user-interface touch


【解决方案1】:

您可以检查鼠标是在边缘还是在边缘之外,而不是试图强制鼠标移动到点击位置,如果是,则使用恒定增量作为增量(最后移动):

void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
    QPoint DeltaPos;
    if(!isInsideWindow(MouseEvent))
    {
       DeltaPos = mPrevDeltaPos;
    }
    else
    {
       DeltaPos = MouseEvent->pos() - mPreviousPos;
       mPrevDeltaPos = DeltaPos;
       // Use DeltaPos to move my rotary
       mPreviousPos = MouseEvent->pos();
     }
}

编辑:

另一种选择是根据全局鼠标坐标而不是相对于窗口 0 的局部坐标计算 DeltaPos - 因为只关心两个鼠标坐标之间的差异,所以不需要将位置链接到窗口。在这种情况下,小部件将按预期在触摸屏和鼠标操作的屏幕上工作 - 无论光标相对于窗口框架如何定位,鼠标/手指的相同移动都会以相同的方式改变方向。

【讨论】:

  • 这不符合我的要求。无论鼠标的实际位置如何,Rotary 对用户来说都应该以相同的方式工作。由于光标被隐藏,用户不会知道他们在边缘,因此 Rotary 将以不同的方式开始工作,而您的解决方案不会向用户提供任何反馈。
  • 是的,我必须同意你关于反馈的观点。请参阅编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多