7

Recently, I wanted that QPushButton can emit a signal, when the mouse pointer enters. How can I make it?

I know that QPushButton has some already defined signal, such as clicked(), pressed(), destory() and so on. But no signal like hover(), enter(), ...

I looked some information about it: Someone said it can be done by css. I don't understand. Can you give me some advice ? Thank you!

4

5 に答える 5

11

これには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-13T13:26:07.617 に答える
3

Make sure to add ':' after the public keyword

public: Q_SIGNALS:
    void hovered();
于 2013-09-09T13:31:19.697 に答える
1

そのため、QT は "イベント" enterEvent ( https://doc.qt.io/qt-5/qevent.html "QEvent::Enter" を探します) を使用してマウス ホバリングを処理します。これはシグナル/スロット機能 ( https://doc.qt.io/qt-5/signalsandslots.html ) に関するものではなく、イベント ( https://doc.qt.io/qt-5/eventsandfilters ) に関するものです。 .html ) QPushButtonクラス ( https://doc.qt.io /qt-5/qpushbutton.html )。

QPushButton から派生した新しいクラスを作成し、QPushButton が QWidget から継承した保護されたメソッド「enterEvent」をオーバーライドする必要があります。

新しいクラスの作成:
QT Creator - ファイル - 新しいファイルまたはプロジェクト...
ファイルとクラス - C++
C++ クラス
選択...
基本クラス - カスタム - QPushButton
次に
、MyPushButton のような新しいクラスの名前を定義します

mypushbutton.h で:

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H

#include <QPushButton>

class MyPushButton: public QPushButton
{
    Q_OBJECT
public:
    using QPushButton::QPushButton;  //inherits the QPushButton constructors

signals:
    void myPushButtonMouseHover();

protected:
    void enterEvent(QEvent *event);
};

#endif // MYPUSHBUTTON_H

mypushbutton.cpp で:

#include "mypushbutton.h"
#include <QMessageBox>

void MyPushButton::enterEvent(QEvent *event)
{
    QMessageBox::warning(this, "Mouse hover", "Mouse hovered MyPushButton"); //popping a message box

    emit myPushButtonMouseHover();  //emitting signal 

    QPushButton::QWidget::enterEvent(event);  //calling the "natural" enterEvent

}
于 2020-11-19T23:24:22.960 に答える
1

私の記憶が正しければ、ボタンのマウス トラッキングを有効にし ( Qt ドキュメント)、オーバーライドする必要がQWidget::onEnter()ありますQWidget::onLeave()

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

于 2012-02-13T13:25:30.107 に答える