【发布时间】: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