QDialog schließt nicht richtig bei done()
Verfasst: 10. Dezember 2009 14:03
Hallo zusammen,
ich habe hier eine von QDialog abgeleitete Klasse, die lediglich 2 Progressbars, 2 Labels und eine ButtonBox beinhaltet.
Der Dialog ist modal, wird also folgendermaßen aufgerufen:
Das Cancel-Signal der ButtonBox ist mit dem reject-Slot des QDialogs verbunden:
Wird der Dialog mittels Cancel-Button beendet funktioniert auch alles wie es soll (result = 0).
Nun aber zum Problem:
Im Kontruktor wird eine Funktion aufgerufen, die ein paar Dinge erledigt (Ftp upload oder download, ...).
Diese Funktion kann relativ schnell fehlschlagen (wenn zB. eine Datei nicht vorhanden ist) und soll dann sofort mit einem dem Fehler entsprechenden Return-Code zurückkehren:
Dies war mein 1. Versuch. Hierbei ist der Dialog obwohl er ins if (bError) reingelaufen ist einfach stehengeblieben, als wäre nichts gewesen und wurde erst korrekt beendet, wenn ich auf den Cancel-Button gedrückt habe.
Mein 2. Versuch war nun, die doSomething()-Funktion erst aufzurufen, wenn der Dialog bereits angezeigt wird (kann ja sein, dass das done() erst zurückkehrt, wenn der Dialog wirklich sichtbar ist).
Also hab ich das showEvent überschrieben und die Funktion von hier aus aufgerufen:
Das Ergebnis ist auch nicht so fein. Wenn nun ein Fehler auftritt und done(iError) in doSomething aufgerufen wird erscheint mein Fenster zwar, allerdings nur "halb" gezeichnet (nur der Rahmen ist schemenhaft erkennbar), außerdem schließt es sich nicht mehr und ich kann es auch nicht mehr selbst schließen, da der Cancel-Button ja noch nicht gezeichnet wurde und der Dialog eigentlich schon geschlossen wurde...
Die Hauptanwendung ist auch nicht mehr bedienbar, weil sie ja aufs tatsächliche Ende des Dialogs wartet...
Schätze mal, dass kommt daher, weil das showEvent nicht Ordnungsgemäß zurückkehrt, sondern mit done(iError) quasi abgestochen wird?
Die Frage wäre jetzt natürlich wie ich es hinbekomme, dass sich der Dialog im Falle eines Fehlers sofort Ordnungsgemäß wieder schließt und der Hauptanwendung den entsprechenden Fehlercode zurückliefert?
danke, mfg
ich habe hier eine von QDialog abgeleitete Klasse, die lediglich 2 Progressbars, 2 Labels und eine ButtonBox beinhaltet.
Der Dialog ist modal, wird also folgendermaßen aufgerufen:
Code: Alles auswählen
FtpUpdateFileDialog updateDlg(this);
int result = updateDlg.exec();Code: Alles auswählen
connect(m_ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));Nun aber zum Problem:
Im Kontruktor wird eine Funktion aufgerufen, die ein paar Dinge erledigt (Ftp upload oder download, ...).
Diese Funktion kann relativ schnell fehlschlagen (wenn zB. eine Datei nicht vorhanden ist) und soll dann sofort mit einem dem Fehler entsprechenden Return-Code zurückkehren:
Code: Alles auswählen
FtpUpdateFileDialog::FtpUpdateFileDialog(QWidget *parent) : QDialog(parent, Qt::CustomizeWindowHint), m_ui(new Ui::FtpUpdateFileDialog)
{
// Parameter initialisieren, ...
m_ui->setupUi(this);
connect(m_ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
doSomething();
}
void FtpUpdateFileDialog::doSomething()
{
// Prüfe irgendwas, mache irgendwas
if (bError) // Zuvor ist irgendwo ein Fehler aufgetreten
{
done(iErrorNo); // Dialog beenden und irgendeine Fehlernummer zurückgeben
}
}Mein 2. Versuch war nun, die doSomething()-Funktion erst aufzurufen, wenn der Dialog bereits angezeigt wird (kann ja sein, dass das done() erst zurückkehrt, wenn der Dialog wirklich sichtbar ist).
Also hab ich das showEvent überschrieben und die Funktion von hier aus aufgerufen:
Code: Alles auswählen
void FtpUpdateFileDialog::showEvent(QShowEvent *e)
{
QDialog::showEvent(e);
doSomething(); // Ist natürlich im Konstruktor nun nicht mehr vorhanden
}Die Hauptanwendung ist auch nicht mehr bedienbar, weil sie ja aufs tatsächliche Ende des Dialogs wartet...
Schätze mal, dass kommt daher, weil das showEvent nicht Ordnungsgemäß zurückkehrt, sondern mit done(iError) quasi abgestochen wird?
Die Frage wäre jetzt natürlich wie ich es hinbekomme, dass sich der Dialog im Falle eines Fehlers sofort Ordnungsgemäß wieder schließt und der Hauptanwendung den entsprechenden Fehlercode zurückliefert?
danke, mfg