Qt щелкните правой кнопкой мыши QPushButton
Я использую Qt Creator, чтобы создать графический интерфейс для игры в миниатюре. Как я могу узнать, что QpushButton нажал правой кнопкой мыши? за флаг в игре. Другими словами, какой сигнал используется для щелчка правой кнопкой мыши?
4 ответа
Создайте свою собственную кнопку с фильтром в слоте mousePressEvent.
qrightclickbutton.h
#ifndef QRIGHTCLICKBUTTON_H
#define QRIGHTCLICKBUTTON_H
#include <QPushButton>
#include <QMouseEvent>
class QRightClickButton : public QPushButton
{
Q_OBJECT
public:
explicit QRightClickButton(QWidget *parent = 0);
private slots:
void mousePressEvent(QMouseEvent *e);
signals:
void rightClicked();
public slots:
};
#endif // QRIGHTCLICKBUTTON_H
qrightclickbutton.cpp
#include "qrightclickbutton.h"
QRightClickButton::QRightClickButton(QWidget *parent) :
QPushButton(parent)
{
}
void QRightClickButton::mousePressEvent(QMouseEvent *e)
{
if(e->button()==Qt::RightButton)
emit rightClicked();
}
Теперь подключите вот так
QRightClickButton *button = new QRightClickButton(this);
ui->gridLayout->addWidget(button);
connect(button, SIGNAL(rightClicked()), this, SLOT(onRightClicked()));
Создайте слот в MainWindow.cpp.
void MainWindow::onRightClicked()
{
qDebug() << "User right clicked me";
}
Меня устраивает!
Я думаю, что QPushButton внутренне реализован для прослушивания только щелчков левой кнопкой мыши. Но вы можете легко расширить QPushButton и повторно реализовать, скажем, событие отпускания мыши и делать свое дело, если нажата правая кнопка мыши, например, выдать пользовательский rightClicked()
сигнал например:
signals:
void rightClicked();
protected:
void mouseReleaseEvent(QMouseEvent *e) {
if (e->button() == Qt::RightButton) emit rightClicked();
else if (e->button() == Qt::LeftButton) emit clicked();
}
... или вы можете создать перегрузку сигнала clicked, который перенаправляет указатель mouseEvent, чтобы вы могли выполнить ту же проверку за пределами кнопки.
signals:
void clicked(QMouseEvent *);
protected:
void mouseReleaseEvent(QMouseEvent *e) {
emit clicked(e);
}
Затем вы делаете проверку в слоте, который вы подключаете кнопки clicked(QMouseEvent *)
подайте сигнал и действуйте соответственно.
Я только что написал этот маленький вспомогательный адаптер, чтобы сделать любую существующую кнопку правой кнопкой мыши без необходимости создавать ее подклассы:
class CRightClickEnabler : public QObject
{
public:
CRightClickEnabler(QAbstractButton * button): QObject(button), _button(button) {
button->installEventFilter(this);
};
protected:
inline bool eventFilter(QObject *watched, QEvent *event) override {
if (event->type() == QEvent::MouseButtonPress)
{
auto mouseEvent = (QMouseEvent*)event;
if (mouseEvent->button() == Qt::RightButton)
_button->click();
}
return false;
}
private:
QAbstractButton* _button;
};
Использование:
connect(ui->pushButton, &QPushButton::clicked, [](){qDebug() << "Button clicked";});
new CRightClickEnabler(ui->pushButton);
Отныне clicked
Сигнал будет вызван как правой кнопкой мыши, так и левой кнопкой мыши. Нет необходимости удалять этот объект - он использует ui->pushButton
как родитель и будет автоматически удаляться Qt при уничтожении родителя.
Очевидно, что вы можете написать 2 строки кода (буквально), чтобы объявить новый сигнал здесь и испустить этот сигнал при щелчке правой кнопкой мыши вместо clicked
при желании.
Я также хотел бы предложить этот вариант, без необходимости в фильтре событий/других материалах...
self.button.released.connect(self.doStuff)
self.button.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.button.customContextMenuRequested.connect(partial(self.doStuff, False))
def doStuff(self,state=True,p=QPoint()):
print("True for left, False for right!",state)