QMainWindow onLoaded
QMainWindow onLoaded
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
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
-
- Beiträge: 605
- Registriert: 28. Juni 2007 15:01
- Kontaktdaten:
oder füge der Class nen public memmber fct zu alla "postCtor" und in der Main rufst die dann nach dem Ctor auf.
Also
Also
Code: Alles auswählen
MainClass mc;
mc.postCtor;
@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
@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
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.
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.
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?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
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...
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
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
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
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
-
- Beiträge: 605
- Registriert: 28. Juni 2007 15:01
- Kontaktdaten:
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!
Klar kann man im konstruktor initialisieren... nur man sollte darauf achten was und wie!
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.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.
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
Zeig doch bitte endlich Code! Ob modal oder nicht ist doch wurscht und kannst du selber in ganz kurzer Zeit testen...
macht absolut keine Probleme...
Wie gesagt, machst du wohl selber irgendwo was falsch.
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();
}
Wie gesagt, machst du wohl selber irgendwo was falsch.
-
- Beiträge: 605
- Registriert: 28. Juni 2007 15:01
- Kontaktdaten: