Сигнал подключения и слот не работает Qt

Я в основном скопировал, вставил код из Вот, и реализовал их в небольшой новой программе, например:

В 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,
Я не знаю, где здесь не так. Так как я могу решить проблему?

Благодарю.

0

Решение

Это то, о чем я думал, вы создали 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);

Вы можете скачать пример в следующем ссылка на сайт

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]