2012-02-13 11 views
5

最近、マウスポインタが入ったときにQPushButtonがシグナルを発することができるようにしたいと考えました。どうしたらいいですか?QPushButtonの上にマウスを置くと、その信号がQPushButtonから放出されますか?

私は、QPushButtonにclicked()pressed()destory()などの定義済みのシグナルがいくつかあることを知っています。しかし、ホバー()、入力()、...のような信号はありません。

私はいくつかの情報を見ました。誰かがそれをCSSで行うことができます。わかりません。アドバイスをいただけますか?ありがとうございました!

+0

、このようなイベントをインターセプトする必要はないかもしれません。たとえば、ボタンの外観を変更したい場合は、スタイルシートでこれを行うことができます。 –

+0

ありがとう..私はそれをしたい:2つのコンポーネントがある場合は、マウスポインタが1つにホバーすると、もう1つは不可視です... –

+1

他のボタンとのマウス操作に基づいてボタンに影響を与えたいので、実際にこのイベントを傍受する必要があります。 –

答えて

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

まず、ありがとうございます。私はそれがちょうどそのようなボタンを使用するので、少しcomlicatedだと思う、他の方法はありますか? –

1

正しく覚えていれば、ボタン(Qt documentation)のマウストラッキングを有効にし、QWidget::onEnter()QWidget::onLeave()を上書きする必要があります。

QPushButtonを継承したカスタムボタンクラスを作成する必要があります。カスタムクラスでmouseEnterとmouseLeaveの信号を定義し、オーバーライドする必要があるonEnter()onLeave()のメソッドからそれらを送出することができます。

+0

オーバーライドする必要がありますか?私を助けてくれてありがとう... –

+1

はい、カスタムボタンクラスでonEnter()とonLeave()関数を実装する必要があります。コード例については、@ Exaの回答を参照してください。 ps。あなたが有用な答えを見つけたら投票してください – dirk

3

追加してください ':' 公共のキーワードの後に​​

public: Q_SIGNALS: 
    void hovered(); 
6

@Exaはこの質問に答えましたが、QPushButtonをサブクラス化する必要がなく、柔軟に使用できる別のソリューションを示したいと思います。 (それは私のプロジェクトで必要なものです)

ステップ1/2:eventFilterをオーバーライドします。

// 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:LoginWindow.h:

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

+0

完璧!ホバーイベントを検出したいウィジェットごとに新しいクラスを作成したくありませんでした。 – BuvinJ

+2

@Cupidvogel私は原因を見つけたと思う。 'eventFilter'関数で' return true'の代わりに 'return QWidget :: eventFilter(obj、event); 'を使い、もう一つはelse条件を必要としません。私はこれを行い、消えていくボタンの状態はなくなった。 – Volomike

関連する問題