QMainWindow onLoaded

Alles rund um die Programmierung mit Qt
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

QMainWindow onLoaded

Beitrag von NoRulez »

Hey @all,

ich würde gerne sobald das Hauptfenster bzw. ein Dialog fertig geladen wurde und sichtbar ist ein Dialogfenster in einem MDIArea öffnen.

Ich hatte schon probiert diesen im showEvent anzuzeigen, aber hier dürfte es noch zu früh sein.

Weiß jemand wie ich das am besten lösen kann? Gibts irgend ein SIGNAL auf das ich mich hängen kann, das ausgelöst wird, sobald das Fenster fertig geladen wurde?

LG NoRulez
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

das Fenster ist nach dem Konstruktor ferig. Mach einfach im Konstruktor einen QTimer::singleShot mit 100-1000 ms delay.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

oder füge der Class nen public memmber fct zu alla "postCtor" und in der Main rufst die dann nach dem Ctor auf.

Also

Code: Alles auswählen

MainClass mc;
mc.postCtor;
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

@Aue: dann kann er's genau so gut auch im CTor machen...

@NoRulez:
1. Warum nicht im Kontruktor?
2. Warum nicht im showEvent? Was bringt dich auf die Idee, dass es "zu früh" ist?

IMHO ist ausserdem das Polish-Event beliebt für solche Sachen.. siehe http://www.qtforum.de/forum/viewtopic.php?t=5027
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

und wenn's im ctor ableiert??
Ich finde es ist schlechter Progrmmierstil alles im ctor zu machen! Der Ctor ist lediglich als initialisierung gedacht-nicht für wilde Funtionsaufrufe mmn
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Irgendwie versteh ich den Sinn nicht. Was bringt es, ein MDI-Fenster aufzumachen, nachdem das Fenster sichtbar ist? Bei ausreichend modernen Rechnern wirst du keinen Unterschied merken, ob das jetzt vor dem show() oder danach passiert. Der einzige Grund der mir hier gerade einfällt, wäre dass das Laden im Konstruktor zu lange dauert und du deshalb auf das Fenster warten musst. Dann bringt aber ein öffnen nach dem Anzeigen auch nix, denn auch wenn das Fenster sichtbar ist, ist es nicht zu bedienen, wenn das Laden im Hauptthread passiert.

Deshalb (falls das dein Beweggrund war) hier zwei Alternativen:
1) Verwende einen SplashScreen. Da sieht der User, dass sein Programm am starten ist und braucht sich nicht über langes Warten wundern.
2) Mach das Laden in einem separaten Thread. Dann kommt das Fenster sofort, und sobald der Thread die Daten für das MDI parat hat, wird emitted und ein MDI-Fenster geladen.

Falls du aber etwas anderes vohattest, sag doch WAS das genau ist, dann kann man dir auch besser helfen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

AuE hat geschrieben:und wenn's im ctor ableiert??
Ich finde es ist schlechter Progrmmierstil alles im ctor zu machen! Der Ctor ist lediglich als initialisierung gedacht-nicht für wilde Funtionsaufrufe mmn
Was soll im ctor ableiern? Und in meinen Augen darf man natürlich wilde Funktionsaufrufe im CTor machen, wenn sie gebraucht werden. Und dazu gehört doch auch, das Fenster aufzubauen, oder?
Und nebenbei, wenn der "wilde Funktionsaufruf" nach dem Konstruktor geschieht, kann dieser genauso ableiern. Und wenn dann dort auf Fehler nicht reagiert wird, ist das Programm am Ende genauso futsch...

Aber das ist auch irgendwo Geschmackssache und zu Anwendungsbezogen, dass man ohne genauer Aufgabenstellung auch nur über Sinn und Unsinn spekulieren kann...
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Das MainWindow ist mit dem Designer erstellt, genauso wie die MDI Area.

wenn ich nun im Konstruktor oder im showEvent das fensert im MDI Bereich anlegen und anzeigen möchte, das ganze kompiliere und starte, dann bleibt die Applikation hängen. Deswegen dachte ich das es zu früh ist. Wenn den code zum erzeugen des Dialogs auskommentiere funktionierts einwandfrei.

LG NoRulez
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Da denkst du falsch, das ist dann ein bug in deinem Code.
Poste den doch mal.

Du kannst auch einfach ausprobieren, was passiert, wenn du diesen Code in eine separate Funktion auslagerst und diese Funktion selber aufrufst, nachdem das Objekt instantiiert wurde. Hängt es liegts am Code, hängt es nicht würde mich noch mehr Code interessieren :)
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Du hast aber keinen Modalen Dialog aufgerufen oder?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Ich meine mit sowas zB das man eine Verbindung zu einer DB (wenn mans net in nen eigenen Thread machen möchte) nicht im Ctor aufbaut... man überlege sich das hässliche bild das bei rauskommt wenn die Verbindung mangels nicht vorhandenen Server in nen Timeout läuft.
Klar kann man im konstruktor initialisieren... nur man sollte darauf achten was und wie!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

AuE hat geschrieben:Ich meine mit sowas zB das man eine Verbindung zu einer DB (wenn mans net in nen eigenen Thread machen möchte) nicht im Ctor aufbaut... man überlege sich das hässliche bild das bei rauskommt wenn die Verbindung mangels nicht vorhandenen Server in nen Timeout läuft.
Bei nem Timeout ist doch noch nix verloren, oder? Eine connect()-Methode sollte bei so was einfach einen Errorcode zurückgeben. Ob dieser im Konstruktor oder in ner anderen Methode abgefangen wird, ist doch wurscht. In dem Beispiel ist das nur ne Verlagerung der problematik.
Wenn ich als Programmierer eine externe Klasse verwende, möchte ich eigentlich, dass diese nach dem Konstruktor-Aufruf korrekt arbeitet und nicht erst noch initialisiert werden muss.

Wenn also die Vorgabe ist, dass ein Dokument am Anfang geöffnet sein muss (z.B. die letzte Session hergestellt, da das in den Settings eingestellt wurde), sollte das auch im Konstruktor erledigt werden. Meine Meinung :)

Außerdem geht das hier eh am Problem vorbei, denn ich denke wir haben es hier mit einer Endlosschleife zu tun ;)
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

@CaptnChaos: Doch ist ein modaler Dialog

LG NoRulez
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Zeig doch bitte endlich Code! Ob modal oder nicht ist doch wurscht und kannst du selber in ganz kurzer Zeit testen...

Code: Alles auswählen

//// win.h

#ifndef MAIN_WIN_H
#define MAIN_WIN_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    public:
        MainWindow(QWidget* parent=0);
};

#endif


//// win.cpp

#include "win.h"
#include <QMdiArea>
#include <QFileDialog>

MainWindow::MainWindow( QWidget* parent)
 : QMainWindow(parent)
{
    QMdiArea * mdi = new QMdiArea(this);
    setCentralWidget(mdi);
    QFileDialog* dlg = new QFileDialog(this);
    dlg->setModal(true);
    mdi->addSubWindow(dlg);
}


//// main.cpp

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

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    MainWindow mw;
    mw.show();
    return QApplication::exec();
}
macht absolut keine Probleme...

Wie gesagt, machst du wohl selber irgendwo was falsch.
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Wenn der dialog modal ist, ist es klar das die anwendung "hängen" bleibt. sie wartet bis der dialog mit einer rückgabe (ok, cancel) geschlossen wird.
Antworten