我已经在 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 中找不到这样的功能。