Я использую Qt Creator для создания графического интерфейса для игры сапера. Как я могу узнать, что QpushButton щелкнул правой кнопкой мыши? для флага в игре. Другими словами, какой сигнал используется для щелчка правой кнопкой мыши?
Qt щелкните правой кнопкой мыши QPushButton
Ответы (3)
Создайте свою кнопку с фильтром в слоте 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::mousePressEvent(e);
в конце переопределенного mousePressEvent(QMouseEvent *e)
- person Krzysiek; 24.04.2016
Я думаю, что 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();
}
... или вы можете создать перегрузку сигнала щелчка, который перенаправляет указатель mouseEvent, чтобы вы могли выполнить ту же проверку за пределами кнопки.
signals:
void clicked(QMouseEvent *);
protected:
void mouseReleaseEvent(QMouseEvent *e) {
emit clicked(e);
}
Затем вы выполняете проверку в слоте, к которому подключаете сигнал кнопки clicked(QMouseEvent *)
, и действуете соответствующим образом.
QPushButton
, а button()
в нем нет. что я должен делать?
- person Khosi; 27.03.2013
button()
является методом QMouseEvent
.
- person cmannett85; 27.03.2013
mouseReleaseEvent
. почему вы звоните rightClicked()
в mouseReleaseEvent
?
- person Khosi; 27.03.2013
clicked
происходит, когда вы нажимаете, а затем отпускаете кнопку. Таким образом, вы получаете поведение по умолчанию — когда вы нажимаете кнопку, но перемещаете мышь из нее, прежде чем отпустить — вы не получаете щелчок. Вы можете настроить это в соответствии с вашими потребностями, вы также можете использовать mousePressEvent, если хотите.
- person dtech; 27.03.2013
mouseReleaseEvent()
родителя вместо того, чтобы вручную генерировать clicked()
здесь?
- person eepp; 22.08.2015
Я только что написал этот небольшой вспомогательный адаптер, чтобы сделать любую существующую кнопку доступной для щелчка правой кнопкой мыши без необходимости ее подкласса:
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
.
QEvent::MouseButtonDblClick
! На самом деле, я бы, вероятно, также сказал, что его следует просто изменить на QEvent::MouseButtonRelease
, так как это все равно происходит, когда щелчок выполняется. не в прессе.
- person Steven Lu; 14.05.2021
event()
и самостоятельно излучать сигнал. - person rainer   schedule 27.03.2013