我正在使用Qt Creator为中型游戏创建一个gui。 如何知道点击右键单击QpushButton?在游戏中的标志。 换句话说,哪个信号用于右键单击?
答案 0 :(得分:18)
使用 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";
}
对我有用!
答案 1 :(得分:6)
我认为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 *)
信号的插槽中进行检查,然后相应地继续。
答案 2 :(得分:3)
我刚刚编写了这个小助手适配器,可以使任何现有的按钮可以右键单击而无需将其子类化:
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
时发出该信号。