Как испустить сигнал от QPushButton, когда на него наведена мышь? - PullRequest
5 голосов
/ 13 февраля 2012

Недавно я хотел, чтобы QPushButton мог издавать сигнал, когда вводится указатель мыши.Как я могу это сделать?

Я знаю, что QPushButton имеет некоторый уже определенный сигнал, такой как clicked(), pressed(), destory() и так далее.Но никаких сигналов, таких как hover (), enter (), ...

Я посмотрел некоторую информацию об этом: кто-то сказал, что это может сделать css.Я не понимаюВы можете дать мне какой-то совет ?Спасибо!

Ответы [ 4 ]

8 голосов
/ 13 февраля 2012

Для этого вы можете использовать QWidget :: enterEvent (событие QEvent *) .

Вы перезаписываете это событие и отправляете пользовательский определенный сигнал, когда это событие происходит.

Сначала необходимо включить отслеживание мыши для этого виджета (например, 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()) );
6 голосов
/ 23 мая 2014

Хотя @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);
    ...
}
3 голосов
/ 09 сентября 2013

Обязательно добавьте ':' после открытого ключевого слова

public: Q_SIGNALS:
    void hovered();
1 голос
/ 13 февраля 2012

Если я правильно помню, вам нужно включить отслеживание мыши для кнопки ( Документация Qt ) и переопределить QWidget::onEnter() и QWidget::onLeave().

Вам нужно будет создать пользовательский класс кнопок, наследующий от QPushButton. Вы можете определить сигналы для mouseEnter и mouseLeave в своем пользовательском классе и отправлять их из методов onEnter() и onLeave(), которые необходимо переопределить.

...