Qt 为QWidget设置一致的鼠标光标

Qt 为QWidget设置一致的鼠标光标,qt,qwidget,mouse-cursor,Qt,Qwidget,Mouse Cursor,我对QWidget进行了子分类,以便使用鼠标在其上绘制。 我使用setCursor将其光标更改为十字形状。 它工作正常,但只要我按下鼠标按钮(例如画手绘线),光标就会变回应用程序光标。 请注意,我不想在mouseenter事件上使用setOverrideCursor,例如,因为我只想为这个小部件而不是整个应用程序更改光标,而且我有一个更好的解决方法(如下所示) 我目前的解决方案是使用 setCursor(cursor()); 在我重写的mousePressEvent(QMouseEvent*事件

我对QWidget进行了子分类,以便使用鼠标在其上绘制。 我使用setCursor将其光标更改为十字形状。 它工作正常,但只要我按下鼠标按钮(例如画手绘线),光标就会变回应用程序光标。 请注意,我不想在mouseenter事件上使用setOverrideCursor,例如,因为我只想为这个小部件而不是整个应用程序更改光标,而且我有一个更好的解决方法(如下所示)

我目前的解决方案是使用 setCursor(cursor()); 在我重写的mousePressEvent(QMouseEvent*事件)和mouseDoubleClickEvent(QMouseEvent*事件)中 后者是因为出于某种原因,双击也会将光标暂时更改为应用程序光标! 解决方法是有效的:)但我想看看是否有更好的解决方案,要求QT根本不更改光标

我应该补充一点,拖放未激活

以下是请求的一些源代码片段:

class MyWidget : public QWidget
{
    void paintEvent( QPaintEvent * /*event*/ );
    void resizeEvent( QResizeEvent * event );
    void mouseDoubleClickEvent ( QMouseEvent * event );
    void mousePressEvent( QMouseEvent* event );
    void mouseReleaseEvent( QMouseEvent* event );
    void mouseMoveEvent( QMouseEvent* event );
    void wheelEvent( QWheelEvent* event );
}
然后我覆盖以下内容(用于解决方法)

要更改游标,假设用我的类实例化了
mywidget
,我要执行以下操作:
mywidget->setCursor(Qt::CrossCursor)

同样,当我将鼠标悬停在控件上时,它会按预期更改光标,但当我按下鼠标按钮时,它会变回应用程序光标(因此需要上述解决方法)

好的,我仍然没有找到任何答案,因此这里是解决方法:


当QWidget关闭时,如果您设置了一次特定的光标(比如,在构造函数中),只要鼠标经过该小部件,就会将光标设置回原始光标

,这就是光标的显示方式。一旦鼠标退出小部件,光标应自动变回正常状态。当鼠标进入、离开或被点击时,您不必做任何特殊的更改。您能提供一些源代码吗?@ArnoldSpence我确实使用setCursor,它会自动更改光标,正如您所说的:进入、退出。但是,光标仅在未按下鼠标按钮时应用。我一按下按钮,光标就会变回应用程序光标(如果事先调用了setOverrideCursor,则将使用它,否则将使用OS默认值)。从Q:“请注意,我不想在mouseenter事件上使用setOverrideCursor,例如,因为我只想更改此小部件的光标,而不是整个应用程序的光标。”这将为应用程序设置光标
void MyWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
void MyWidget::mousePressEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
void MyWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
void MyWidget::mousePressEvent(QMouseEvent * event)
{
    // ... do some other stuff ...
    // This is a workaround to prevent the cursor from changing
    setCursor(cursor());
    event->accept();
}
QApplication.setOverrideCursor(QtGui.QCursor(Qt.CrossCursor))