Seite 1 von 2
QMainWindow onLoaded
Verfasst: 11. August 2009 08:05
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
Verfasst: 11. August 2009 08:34
von CaptnChaos
das Fenster ist nach dem Konstruktor ferig. Mach einfach im Konstruktor einen QTimer::singleShot mit 100-1000 ms delay.
Verfasst: 11. August 2009 08:36
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
Verfasst: 11. August 2009 08:45
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
Verfasst: 11. August 2009 08:58
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
Verfasst: 11. August 2009 09:21
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.
Verfasst: 11. August 2009 09:25
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...
Verfasst: 11. August 2009 09:43
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
Verfasst: 11. August 2009 09:46
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

Verfasst: 11. August 2009 10:08
von CaptnChaos
Du hast aber keinen Modalen Dialog aufgerufen oder?
Verfasst: 11. August 2009 10:15
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!
Verfasst: 11. August 2009 10:51
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

Verfasst: 11. August 2009 11:24
von NoRulez
@CaptnChaos: Doch ist ein modaler Dialog
LG NoRulez
Verfasst: 11. August 2009 12:03
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.
Verfasst: 11. August 2009 12:19
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.