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

Благодарю.

1 ответ

Решение

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

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

Другие вопросы по тегам