未发出信号
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()
这就是为什么没有发出信号的原因。所以你需要在堆上创建对象或者做一些技巧。
还有,你在你的ComboBox
class动态分配了对象*box
并且没有指定这个对象的父对象,所以似乎内存泄漏是可能的。在 ComboBox
class.
的析构函数中指定父对象或删除对象
我对未发出信号有疑问。这是此问题的最小示例:
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()
这就是为什么没有发出信号的原因。所以你需要在堆上创建对象或者做一些技巧。
还有,你在你的ComboBox
class动态分配了对象*box
并且没有指定这个对象的父对象,所以似乎内存泄漏是可能的。在 ComboBox
class.