9

我正在使用 Qt Creator 为 mineseeper 游戏创建 gui。我怎么知道用右键单击的 QpushButton?为游戏中的旗帜。换句话说,哪个信号用于右键单击?

4

4 回答 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 回答