Сигнал отклонения, кажется, испускается только один раз - PullRequest
0 голосов
/ 27 марта 2012

Я создал очень простой GUI-проект в Qt следующим образом:

main:

#include <QApplication>
#include "dialog.h"
int main(int c, char* v[])
{
    QApplication app(c,v);
    Dialog* d = new Dialog;
    d->show();
    app.exec();
}

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include "ui_dialog.h"
#include "progress_dialog.h"

class Dialog : public QDialog, private Ui::Dialog
{
    Q_OBJECT

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

private:
    progress_dialog* progress_dialog_;
public slots:
    void create_and_show_progress_dialog();
    void delete_progress_dialog();
};

#endif // DIALOG_H

dialog.cpp:

#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),progress_dialog_(new progress_dialog)
{
    setupUi(this);
    connect(pushButton,SIGNAL(clicked()),this,SLOT(create_and_show_progress_dialog()));
    connect(progress_dialog_,SIGNAL(rejected()),this,SLOT(delete_progress_dialog()));
}

void Dialog::create_and_show_progress_dialog()
{
    if (!progress_dialog_)
        progress_dialog_ = new progress_dialog;
    progress_dialog_->exec();
}

void Dialog::delete_progress_dialog()
{
    delete progress_dialog_;
    progress_dialog_ = nullptr;
    QMessageBox::information(this,"Progress destroyed","I've just destroyed progress");
}

Dialog::~Dialog()
{
}

progress_dialog:

#ifndef PROGRESS_DIALOG_H
#define PROGRESS_DIALOG_H

#include "ui_progress_dialog.h"

class progress_dialog : public QDialog, private Ui::progress_dialog
{
    Q_OBJECT

public:
    explicit progress_dialog(QWidget *parent = 0);
public slots:
    void exec_me();
};

#endif // PROGRESS_DIALOG_H

progress_dialog.cpp:

#include "progress_dialog.h"

progress_dialog::progress_dialog(QWidget *parent) :
    QDialog(parent)
{
    setupUi(this);
}

Таким образом, проблема заключается в том, что после запуска этого приложения и нажатия кнопки push_ в главном диалоговом окне progress_dialogотображаетсяПосле нажатия кнопки push_buttong на progress_dialog, который подключен к слоту отклонения, это диалоговое окно закрывается и отображается сообщение: QMessageBox :: information (this, "Progress Destolved", "I'm just Destroy Progress");

Но когда я делаю это второй раз (нажмите кнопку в главном диалоговом окне, а затем закройте диалоговое окно progress_dialog), сообщение не отображается.Попытался отладить это и установить точку останова на:

void Dialog::delete_progress_dialog()
{
    delete progress_dialog_;//HERE BREAKPOINT WAS PLACED
    progress_dialog_ = nullptr;
    QMessageBox::information(this,"Progress destroyed","I've just destroyed progress");
}

, но эта точка останова срабатывает только в первый раз, и после этого никакие попадания на эту точку останова не выполняются.
Что происходит?

1 Ответ

1 голос
/ 27 марта 2012

Вам необходимо повторно подключать сигнал каждый раз, когда вы создаете новый progress_dialog - когда вы уничтожаете старый, соединение теряется (как это может быть иначе, вы просто зарезали источник сигнала).

То же самое происходит в create_and_show_progress_dialog при создании нового объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...