QT — Как испускать сигнал от QPushButton, когда мышь наводится на него?

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

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

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

5

Решение

Ты можешь использовать 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()) );
8

Другие решения

Хотя @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);
...
}
6

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

public: Q_SIGNALS:
void hovered();
3

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

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

1
По вопросам рекламы [email protected]