Недавно я хотел это QPushButton
может издавать сигнал, когда вводится указатель мыши. Как я могу это сделать?
Я знаю, что QPushButton имеет некоторый уже определенный сигнал, такой как clicked()
, pressed()
, destory()
и так далее. Но нет сигнала, как hover (), введите (), …
Я посмотрел некоторую информацию об этом: кто-то сказал, что это может быть сделано 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()) );
Хотя @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);
...
}
Обязательно добавьте «:» после открытого ключевого слова
public: Q_SIGNALS:
void hovered();
Если я правильно помню, нужно включить отслеживание мыши для кнопки (Документация Qt) и переопределить QWidget::onEnter()
а также QWidget::onLeave()
,
Вам нужно будет создать собственный класс кнопки, наследуемый от QPushButton. Вы можете определить сигналы для mouseEnter и mouseLeave в своем пользовательском классе и излучать их из onEnter()
а также onLeave()
методы, которые вам нужно переопределить.