Qt右键点击QPushButton

时间:2013-03-27 12:11:02

标签: qt right-click qpushbutton

我正在使用Qt Creator为中型游戏创建一个gui。 如何知道点击右键单击QpushButton?在游戏中的标志。 换句话说,哪个信号用于右键单击?

3 个答案:

答案 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时发出该信号。