2012-02-13 2009 views
5

最近,我希望QPushButton可以在鼠標指針進入時發出信號。我怎麼做到的?當鼠標懸停在QPushButton上時如何發出信號?

我知道QPushButton有一些已經定義好的信號,比如clicked(),pressed(),destory()等等。但沒有信號懸停(),輸入(),...

我看了一些關於它的信息:有人說可以通過CSS來完成。我不明白。你能給我一些建議嗎?謝謝!

+0

如果你可以解釋當鼠標懸停時你想要做什麼,可能不需要攔截這樣的事件。例如,如果想要更改按鈕的外觀,可以使用樣式表完成此操作。 – 2012-02-13 14:37:22

+0

謝謝..我想這樣做:如果有兩個組件,一旦鼠標指針懸停在一個上,另一個是不可見的... – 2012-02-13 14:48:53

+1

好吧,既然你想影響一個基於鼠標與另一個按鈕交互的按鈕,你確實需要截獲這個事件。 – 2012-02-13 14:59:40

回答

7

您可以使用QWidget::enterEvent (QEvent * event)這個。

您覆蓋此事件並在發生此事件時發送自定義信號。

首先,您必須爲此小部件啓用鼠標跟蹤(例如,在構造函數中爲setMouseTracking(true))。

頭文件

class my_button 
{ 
    // ... 

protected: 
    virtual void enterEvent(QEvent* e); 

public Q_SIGNALS: 
    void hovered(); 

    // ... 
}; 

源文件:

void my_button::enterEvent(QEvent* e) 
{ 
    Q_EMIT hovered(); 

    // don't forget to forward the event 
    QWidget::enterEvent(e); 
} 

你用你的按鈕:

connect(one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered())); 
+0

,請投票,謝謝。我認爲這有點令人費解,因爲我只用一個這樣的按鈕,還有其他方法嗎? – 2012-02-13 13:33:25

1

如果我沒有記錯,您需要啓用按鈕的鼠標跟蹤(Qt documentation)並覆蓋QWidget::onEnter()QWidget::onLeave()

您將需要創建一個從QPushButton繼承的自定義按鈕類。您可以在自定義類中爲mouseEnter和mouseLeave定義信號,並從您需要覆蓋的方法onEnter()onLeave()中發出信號。

+0

必須被覆蓋?感謝您幫助我... – 2012-02-13 13:36:37

+1

是的,您必須在自定義按鈕類中實現onEnter()和onLeave()函數。請參閱@ Exa的代碼示例答案。 PS。如果您首先發現有用的答案 – dirk 2012-02-13 13:40:50

3

確保添加 ':' 公共關鍵字後

public: Q_SIGNALS: 
    void hovered(); 
6

儘管@Exa已經回答了這個問題,但我想展示另一個不需要繼承QPushButton並且使用靈活的解決方案! (這是我在我的項目中需要的)

第1/2步:重寫eventFilter。

LoginWindow.h:

// LoginWindow is where you placed your QPushButton 
//(= most probably your application windows) 

class LoginWindow: public QWidget 
{ 
public: 
     bool eventFilter(QObject *obj, QEvent *event); 
.. 
}; 

LoginWindow.cpp:

bool LoginWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    // This function repeatedly call for those QObjects 
    // which have installed eventFilter (Step 2) 

    if (obj == (QObject*)targetPushButton) { 
     if (event->type() == QEvent::Enter) 
     { 
     // Whatever you want to do when mouse goes over targetPushButton 
     } 
     return true; 
    }else { 
     // pass the event on to the parent class 
     return QWidget::eventFilter(obj, event); 
    } 
} 

步驟2/2:在目標窗口小部件安裝eventFilter。

LoginWindow::LoginWindow() 
{ 
    ... 
    targetPushButton->installEventFilter(this); 
    ... 
} 
+0

這是一個非常好的答案。但是出於一些奇怪的原因,當我在QToolButton上應用這個邏輯時(顯示一些自定義的文本彈出來懸停在它上面),該按鈕變得不可見,儘管它懸停在應該顯示彈出窗口的位置,並且即使光標變成了預期的指針,因爲我爲它設置了按鈕! – SexyBeast 2015-02-21 22:37:05

+0

完美!我不想爲每個想要檢測懸停事件的小部件創建一個新類! – BuvinJ 2015-05-06 20:09:57

+2

@Cupidvogel我想我找到了原因。 'eventFilter'函數不是'return true',而是使用'return QWidget :: eventFilter(obj,event);'也不需要else條件。我做到了這一點,消失的按鈕狀態消失了。 – Volomike 2015-08-25 05:56:42

相關問題