2012-03-27 2 views
0

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

главная:

#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 

. 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_di ALOG:

#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_button на главном экране, что отображается progress_dialog. После нажатия кнопки push_buttong на progress_dialog, который подключен к слоту отклонения, этот диалог закрывается и отображается сообщение: QMessageBox :: информация (это «Прогресс уничтожен», «Я только что уничтожил прогресс»);

Но когда я делаю это второй раз (нажмите кнопку в главном диалоговом окне, а затем закройте 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

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

Так что сделайте соединение в create_and_show_progress_dialog при создании нового объекта.

+0

Мат спасибо большое! – smallB

Смежные вопросы