最近,我希望QPushButton
可以在鼠標指針進入時發出信號。我怎麼做到的?當鼠標懸停在QPushButton上時如何發出信號?
我知道QPushButton有一些已經定義好的信號,比如clicked()
,pressed()
,destory()
等等。但沒有信號懸停(),輸入(),...
我看了一些關於它的信息:有人說可以通過CSS來完成。我不明白。你能給我一些建議嗎?謝謝!
最近,我希望QPushButton
可以在鼠標指針進入時發出信號。我怎麼做到的?當鼠標懸停在QPushButton上時如何發出信號?
我知道QPushButton有一些已經定義好的信號,比如clicked()
,pressed()
,destory()
等等。但沒有信號懸停(),輸入(),...
我看了一些關於它的信息:有人說可以通過CSS來完成。我不明白。你能給我一些建議嗎?謝謝!
您可以使用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()));
,請投票,謝謝。我認爲這有點令人費解,因爲我只用一個這樣的按鈕,還有其他方法嗎? – 2012-02-13 13:33:25
如果我沒有記錯,您需要啓用按鈕的鼠標跟蹤(Qt documentation)並覆蓋QWidget::onEnter()
和QWidget::onLeave()
。
您將需要創建一個從QPushButton繼承的自定義按鈕類。您可以在自定義類中爲mouseEnter和mouseLeave定義信號,並從您需要覆蓋的方法onEnter()
和onLeave()
中發出信號。
必須被覆蓋?感謝您幫助我... – 2012-02-13 13:36:37
是的,您必須在自定義按鈕類中實現onEnter()和onLeave()函數。請參閱@ Exa的代碼示例答案。 PS。如果您首先發現有用的答案 – dirk 2012-02-13 13:40:50
確保添加 ':' 公共關鍵字後
public: Q_SIGNALS:
void hovered();
儘管@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);
...
}
這是一個非常好的答案。但是出於一些奇怪的原因,當我在QToolButton上應用這個邏輯時(顯示一些自定義的文本彈出來懸停在它上面),該按鈕變得不可見,儘管它懸停在應該顯示彈出窗口的位置,並且即使光標變成了預期的指針,因爲我爲它設置了按鈕! – SexyBeast 2015-02-21 22:37:05
完美!我不想爲每個想要檢測懸停事件的小部件創建一個新類! – BuvinJ 2015-05-06 20:09:57
@Cupidvogel我想我找到了原因。 'eventFilter'函數不是'return true',而是使用'return QWidget :: eventFilter(obj,event);'也不需要else條件。我做到了這一點,消失的按鈕狀態消失了。 – Volomike 2015-08-25 05:56:42
如果你可以解釋當鼠標懸停時你想要做什麼,可能不需要攔截這樣的事件。例如,如果想要更改按鈕的外觀,可以使用樣式表完成此操作。 – 2012-02-13 14:37:22
謝謝..我想這樣做:如果有兩個組件,一旦鼠標指針懸停在一個上,另一個是不可見的... – 2012-02-13 14:48:53
好吧,既然你想影響一個基於鼠標與另一個按鈕交互的按鈕,你確實需要截獲這個事件。 – 2012-02-13 14:59:40