Как подключиться к слоту 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);