Как подключиться к слоту mousePressEvent Qt

В Class Buttons, У меня есть btnRightClicked сигнал и mousePressEvent слот:

void Buttons::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton) {
        emit btnRightClicked();
    }
}

И в mainwindow.cppПодключаю btnRightClicked сигнал к onRightClicked слот как это:

connect(&mButtons, SIGNAL(btnRightClicked()), this, SLOT(onRightClicked()));

onRightClicked слот выглядит так:

void MainWindow::onRightClicked()
{
    qDebug() << "right clicked";
}

Но я запустил эту программу, ничего не случилось. Я думаю, причина в том, что я не подключился к mousePressEvent слот. Я новичок в Qt, я не знаю, прав я или нет.

Я установил несколько кнопок на центральном виджете, я хочу, чтобы при каждом щелчке правой кнопкой мыши на них происходило событие правой кнопки мыши. Так как я могу сделать эту работу?

Спасибо

Редактировать: в button.h:

class Buttons : public QObject
{
    Q_OBJECT
public:
    Buttons();
    QVector<QPushButton*> buttons;

    void setButtons(int totalBtns) {
        for(int i = 0; i < totalBtns; i++) {
            buttons[i]->setObjectName(QString::number(i));
            buttons[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        }
    }

public slots:
    void mousePressEvent(QMouseEvent *e) {
        if(e->button() == Qt::RightButton) {
            emit btnRightClicked();
        }
    }

signals:
    void btnRightClicked();
};

1 ответ

Решение

Чтобы щелкнуть правой кнопкой мыши на виджете, вам нужно реализовать собственный виджет кнопки.

class MyButton : public QPushButton
{
 Q_OBJECT

public:
    MyButton(QWidget *parent = Q_NULLPTR);

private slots:
    void mousePressEvent(QMouseEvent *e);

signals:
    void btnRightClicked();
};

CPP

MyButton:MyButton(QWidget * parent) : 
    QPushButton(parent)
{
}
void MyButton::mousePressEvent(QMouseEvent *e)
{
    if(e->button()==Qt::RightButton)
        emit btnRightClicked();

    //this forwards the event to the QPushButton
    QPushButton::mousePressEvent(e);
}

В вашем классе кнопок измените вектор кнопки на

 QVector<MyButton*> buttons;

Затем зарегистрируйте событие правого клика вашего MyButton к вашему сигналу в Buttons Затем класс переправил сигнал вашему mainWindow

connect(&mButtons, &Buttons::btnRightClicked,
        this,      &MainWindow::onRightClicked);
Другие вопросы по тегам