2011-10-07 31 views
2

我有使用鼠标在其上绘制的QWidget子类。 我使用setCursor将其光标更改为十字形状。 它工作正常,但只要我按下鼠标按钮(例如绘制手绘线),光标将变回应用程序光标。 请注意,我不希望在mouseenter事件上使用setOverrideCursor,例如因为我想仅为此小部件更改光标而不是整个应用程序,并且我有更好的解决方法(如下所示)。我目前的解决方案是使用 setCursor(cursor()); 在我重写的mousePressEvent(QMouseEvent *事件)和mouseDoubleClickEvent(QMouseEvent *事件) 后者是因为某种原因双击也将光标更改为应用程序光标一会儿! 解决方法工作:)但我想看看是否有更好的解决方案,要求QT不要改变光标。为QWidget设置一致的鼠标光标

我应该补充说没有激活拖放功能。

这里是要求一些源代码片段:

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

然后我重写以下(用于解决方法)

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

要改变光标假设mywidget被实例化与我的课,我做到这一点:mywidget->setCursor(Qt::CrossCursor) 同样,当我将鼠标悬停在我的控件上时,它会按预期更改光标,但是一旦按下鼠标按钮,它就会变回应用程序光标(因此需要上述工作空间d)

+1

如果设置一个特定的光标一次(比方说,在构造函数),当鼠标经过该小部件,这就是光标应该出现的方式。一旦鼠标退出小部件,光标应该自动回到正常状态。当鼠标进入,离开或被点击时,你不需要做任何特别的改变。 –

+0

你能否提供一些源代码? – Septagram

+0

@ArnoldSpence那么我使用setCursor,它会自动改变光标,就像你说的输入,退出一样。但是,只有在未按下鼠标按钮时才应用光标。只要按下按钮,光标就会变回应用程序光标(如果预先调用setOverrideCursor,则会使用它,否则将使用OS默认值)。 – dashesy

回答

0

好,我还没有发现这方面的任何答案,所以这里是解决办法:

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