连接信号和插槽不工作Qt

时间:2017-11-25 03:12:53

标签: c++ qt qt5 qt-signals qt-slot

我主要是复制,粘贴Here的代码,并在一个小的新程序中实现它们,如下所示:
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 个答案:

答案 0 :(得分:1)

这正是我的想法,你已经创建了一个名为mButtons,并且你已经连接到你的信号,但是那个按钮没有父可视化,因为它在你完成执行构造函数时被删除了,这并不意味着您在QVector中保存的指针会从内存中删除,但它们会保留并发出信号,但这些信号并未连接到任何插槽。

您需要做的是创建一个仅发出信号的按钮:

fit

然后创建一个按钮容器,在循环中创建按钮并连接它:

<强> *的.h

#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

<强> *。CPP

private slots:
    void onRightClicked();

private:
    QVector<MyButton *> mButtons;
};

您可以在以下link

中下载该示例