Qt щелкните правой кнопкой мыши QPushButton

Я использую Qt Creator, чтобы создать графический интерфейс для игры в миниатюре. Как я могу узнать, что QpushButton нажал правой кнопкой мыши? за флаг в игре. Другими словами, какой сигнал используется для щелчка правой кнопкой мыши?

4 ответа

Решение

Создайте свою собственную кнопку с фильтром в слоте 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 внутренне реализован для прослушивания только щелчков левой кнопкой мыши. Но вы можете легко расширить 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();
    }

... или вы можете создать перегрузку сигнала clicked, который перенаправляет указатель mouseEvent, чтобы вы могли выполнить ту же проверку за пределами кнопки.

signals:
    void clicked(QMouseEvent *);

protected:
    void mouseReleaseEvent(QMouseEvent *e) {
        emit clicked(e);
    }

Затем вы делаете проверку в слоте, который вы подключаете кнопки clicked(QMouseEvent *) подайте сигнал и действуйте соответственно.

Я только что написал этот маленький вспомогательный адаптер, чтобы сделать любую существующую кнопку правой кнопкой мыши без необходимости создавать ее подклассы:

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при желании.

Я также хотел бы предложить этот вариант, без необходимости в фильтре событий/других материалах...

          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)
Другие вопросы по тегам