СИГНАЛ не излучается

У меня проблема с тем, что СИГНАЛ не излучается. Вот минимальный пример этой проблемы:

main.cpp — стандартный основной

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

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

    return a.exec();
}

главное окно.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

главное окно.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()
{

}

выпадающий список.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.

Заранее спасибо!


person Zakharn    schedule 04.08.2015    source источник
comment
Проверьте результат оператора подключения. Кроме того, запустите это в отладчике, поставьте точку останова на соединение и проверьте окно вывода приложения при переходе через строку соединения, чтобы убедиться, что соединение установлено правильно. Наконец, используйте синтаксис соединения Qt 5, который проверит соединение во время компиляции. .   -  person TheDarkKnight    schedule 04.08.2015


Ответы (1)


Эта проблема из-за того, что вы создаете свой объект класса ComboBox в стеке. Итак, если вы напишете некоторую отладочную информацию в деструкторе этого класса, вы увидите, что объект уничтожается сразу после того, как конструктор 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*)

виртуальный ComboBox::~ComboBox()

Вот почему сигнал не излучается. Итак, вам нужно создать объект в куче или сделать что-то трюки.

Кроме того, вы динамически выделили объект *box в своем классе ComboBox и не указали родителя этого объекта, поэтому кажется, что возможна утечка памяти. Укажите родителя или удалите объект в деструкторе класса ComboBox.

person t3ft3l--i    schedule 04.08.2015