2011-10-07 32 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(); 
}