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

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


person Khosi    schedule 27.03.2013    source источник
comment
Вам, вероятно, потребуется переопределить event() и самостоятельно излучать сигнал.   -  person rainer    schedule 27.03.2013
comment
Почему кто-то -1 этот вопрос ?? Да, усилий могло быть и больше, но вопрос хороший. Спасибо Мухаммеду за хороший ответ.   -  person zeFree    schedule 10.04.2013


Ответы (3)


Создайте свою кнопку с фильтром в слоте 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";
}

Меня устраивает!

person Md. Minhazul Haque    schedule 27.03.2013
comment
Если кто-то хочет подключить() как к общему сигналу clicked(), так и к пользовательскому сигналу rightClicked() - необходимо вызвать QPushButton::mousePressEvent(e); в конце переопределенного mousePressEvent(QMouseEvent *e) - person Krzysiek; 24.04.2016

Я думаю, что 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 *), и действуете соответствующим образом.

person dtech    schedule 27.03.2013
comment
Я использую QPushButton, а button() в нем нет. что я должен делать? - person Khosi; 27.03.2013
comment
@KhoC Что?? button() является методом QMouseEvent. - person cmannett85; 27.03.2013
comment
поэтому я не знаю, как я могу использовать mouseReleaseEvent. почему вы звоните rightClicked() в mouseReleaseEvent ? - person Khosi; 27.03.2013
comment
@KhoC - потому что событие clicked происходит, когда вы нажимаете, а затем отпускаете кнопку. Таким образом, вы получаете поведение по умолчанию — когда вы нажимаете кнопку, но перемещаете мышь из нее, прежде чем отпустить — вы не получаете щелчок. Вы можете настроить это в соответствии с вашими потребностями, вы также можете использовать mousePressEvent, если хотите. - person dtech; 27.03.2013
comment
Почему бы не вызвать mouseReleaseEvent() родителя вместо того, чтобы вручную генерировать clicked() здесь? - person eepp; 22.08.2015

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

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.

person Violet Giraffe    schedule 17.10.2016
comment
Этот код великолепен, потому что у меня были серьезные проблемы с работой подклассов (хотя qt noob здесь). Просто хочу отметить кое-что важное, это будет ненадежно, если вы слишком быстро щелкнете правой кнопкой мыши по объекту. Вы просто должны также справиться с этим для QEvent::MouseButtonDblClick! На самом деле, я бы, вероятно, также сказал, что его следует просто изменить на QEvent::MouseButtonRelease, так как это все равно происходит, когда щелчок выполняется. не в прессе. - person Steven Lu; 14.05.2021
comment
@StevenLu, это хорошее и разумное предложение, спасибо, что указали на него! И я рад слышать, что мой небольшой фрагмент кода помог. - person Violet Giraffe; 15.05.2021