Я в основном скопировал, вставил код из Вот, и реализовал их в небольшой новой программе, например:
В mybutton.h
:
class MyButton : public QPushButton
{
Q_OBJECT
public:
MyButton(QWidget *parent = Q_NULLPTR);
QVector<MyButton*> buttons;
private slots:
void mousePressEvent(QMouseEvent *e) {
if(e->button()==Qt::RightButton) {
emit btnRightClicked();
qDebug() << "Emitted";
}
}
signals:
void btnRightClicked();
};
И в mainwindow.cpp
:
MyButton mButtons;
QWidget *mWidget = new QWidget(this);
QGridLayout *gLayout = new QGridLayout(mWidget);
mButtons.buttons.resize(5);
for(int i = 0; i < 5; i++) {
mButtons.buttons[i] = new MyButton(mWidget);
gLayout->addWidget(mButtons.buttons[i], 0, i);
}
mWidget->setLayout(gLayout);
setCentralWidget(mWidget);
connect(&mButtons, SIGNAL(btnRightClicked()), this, SLOT(onRightClicked()));
И onRightClicked
слот выглядит так:
void MainWindow::onRightClicked()
{
qDebug() << "clicked";
}
Но выход отладки имеет только это: Emitted
,
Я не знаю, где здесь не так. Так как я могу решить проблему?
Благодарю.
Это то, о чем я думал, вы создали mButtons и подключили его к своему сигналу, но эта кнопка не имеет родителя и не визуализируется, поскольку она удаляется по завершении выполнения конструктора, что не означает, что указатели что вы сохраняете в QVector, удаляются из памяти, но они существуют и излучают сигналы, но они не подключены ни к одному слоту.
Что вам нужно сделать, это создать кнопку, которая излучает только сигнал:
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QMouseEvent>
#include <QPushButton>
#include <QDebug>
class MyButton : public QPushButton
{
Q_OBJECT
public:
MyButton(QWidget *parent = Q_NULLPTR):QPushButton(parent){
}
protected:
void mousePressEvent(QMouseEvent *e) {
if(e->button()==Qt::RightButton) {
emit btnRightClicked();
qDebug() << "Emitted";
}
}
signals:
void btnRightClicked();
};
#endif // MYBUTTON_H
Затем вы создаете контейнер кнопок, а в цикле вы создаете кнопки и подключаете его:
*.час
private slots:
void onRightClicked();
private:
QVector<MyButton *> mButtons;
};
* .cpp
QWidget *mWidget = new QWidget(this);
QGridLayout *gLayout = new QGridLayout(mWidget);
for(int i = 0; i < 5; i++) {
MyButton *btn = new MyButton(mWidget);
gLayout->addWidget(btn, 0, i);
connect(btn, &MyButton::btnRightClicked, this, &MainWindow::onRightClicked);
mButtons << btn;
}
mWidget->setLayout(gLayout);
setCentralWidget(mWidget);
Вы можете скачать пример в следующем ссылка на сайт
Других решений пока нет …