我正在使用 Qt Creator 为 mineseeper 游戏创建 gui。我怎么知道用右键单击的 QpushButton?为游戏中的旗帜。换句话说,哪个信号用于右键单击?
问问题
16916 次
4 回答
19
在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";
}
这个对我有用!
于 2013-03-27T12:31:52.787 回答
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 指针的 clicked 信号的重载,以便您可以在按钮之外进行相同的检查。
signals:
void clicked(QMouseEvent *);
protected:
void mouseReleaseEvent(QMouseEvent *e) {
emit clicked(e);
}
然后,您在将按钮clicked(QMouseEvent *)
信号连接到的插槽中进行检查并相应地进行操作。
于 2013-03-27T12:23:07.077 回答
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
。
于 2016-10-17T10:11:17.993 回答
0
我也想建议这个选项,不需要事件过滤器/其他东西......
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)
于 2021-11-28T20:46:19.710 回答