未发出信号

SIGNAL is not emitted

我对未发出信号有疑问。这是此问题的最小示例:

main.cpp - 标准主

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include "combobox.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    QWidget *mainWidget = new QWidget;
    setCentralWidget(mainWidget);
    QVBoxLayout *mainLayout = new QVBoxLayout;
    combobox combo_box;
    mainLayout->addWidget(combo_box.box);
    mainWidget->setLayout(mainLayout);
}

MainWindow::~MainWindow()
{

}

combobox.h

#ifndef COMBOBOX_H
#define COMBOBOX_H

#include <QComboBox>
#include <QDebug>

class combobox : public QWidget
{
    Q_OBJECT

public:
    combobox();
    ~combobox();

    QComboBox *box = new QComboBox;

public slots:
    void selection_changed();
};

#endif // COMBOBOX_H

combobox.cpp

#include "combobox.h"

combobox::combobox()
{
    QString string = "test 1";
    box->addItem(string);
    string = "test 2";
    box->addItem(string);
    box->setCurrentIndex(0);
    connect(box, SIGNAL(currentIndexChanged(int)), this, SLOT(selection_changed()));
}

combobox::~combobox()
{

}

void combobox::selection_changed()
{
    qDebug() << "Selection changed";
    box->setCurrentIndex(-1);
}

编译前需要运行 qmake。

当我运行这个程序并改变组合框索引时selection_changed不被执行。为什么?

SIGNAL 和 SLOT 连接绝对有效,因为如果我添加 box->setCurrentIndex(1);在组合框构造函数的末尾,selection_changed 将被执行一次。

我正在使用 QT 5.4 和 QT Creator

提前致谢!

这个问题是因为您在堆栈中创建了 ComboBox class 对象。因此,如果你在这个 class 的析构函数中写一些调试信息,你可以看到对象在 MainWindow 构造函数超出范围后立即被销毁:

ComboBox::~ComboBox()
{
    qDebug() << Q_FUNC_INFO;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);


    QWidget *mainWidget = new QWidget;
    setCentralWidget(mainWidget);
    QVBoxLayout *mainLayout = new QVBoxLayout;
    ComboBox combo_box;
    mainLayout->addWidget(combo_box.box);
    mainWidget->setLayout(mainLayout);

    qDebug() << Q_FUNC_INFO;
}

并且qDebug()得到以下结果:

MainWindow::MainWindow(QWidget*)

virtual ComboBox::~ComboBox()

这就是为什么没有发出信号的原因。所以你需要在堆上创建对象或者做一些技巧。

还有,你在你的ComboBoxclass动态分配了对象*box并且没有指定这个对象的父对象,所以似乎内存泄漏是可能的。在 ComboBox class.

的析构函数中指定父对象或删除对象