Hallo, wie kann ich es erreichen, dass ich auf das MainWIdget von anderen Fenstern , dass in main.cpp mit a.setMainWidget(...) festgelegt wurde, zugreifen kann. DIeses MainWidget soll nämlich versteckt (hide) werden, da sich ein neues Widget öffnet. Habe mit den Headern schon alles ausprobiert. Nur wird immer der indentifier des Hauptfensters nicht gefunden. main hat ja keinen Header. Aber auch wenn ich einen erstelle funktioniert es nicht. Danke FÜr die Tipps Holger -- Ich bin nicht sicher, mit welchen Waffen der dritte Weltkrieg ausgetragen wird, aber im vierten Weltkrieg werden sie mit Stöcken und Steinen kämpfen. --Albert Einstein
Hallo, On Sat, 15 Mar 2003, Holger Macht wrote:
wie kann ich es erreichen, dass ich auf das MainWIdget von anderen Fenstern , dass in main.cpp mit a.setMainWidget(...) festgelegt wurde, zugreifen kann.
RTFM: qwidget ==== QWidget * QWidget::topLevelWidget () const Returns the top-level widget for this widget, i.e. the next ancestor widget that has a window-system frame (or at least may have one). If the widget is a top-level, the widget itself is returned. Typical usage is changing the window caption: aWidget->topLevelWidget()->setCaption( "New Caption" ); See also isTopLevel(). ==== -dnh -- "Sich selbst zu zitieren ist egozentrisch, selbstherrlich und unsympathisch. Und ausserdem rekursiv." (Marian Wild in dieser Sig.) [Marian Wild in dag°]
Am Samstag, 15. März 2003 15:33 schrieb David Haller:
Hallo,
On Sat, 15 Mar 2003, Holger Macht wrote:
wie kann ich es erreichen, dass ich auf das MainWIdget von anderen Fenstern , dass in main.cpp mit a.setMainWidget(...) festgelegt wurde, zugreifen kann.
RTFM: qwidget
Habe ich getan ...
If the widget is a top-level, the widget itself is returned. ...
Genau das ist das Problem. Der Returnwert ist NULL bei mir. Ich will ja von einem TopLevelWidget auf das a.setMainWidget zugreifen.
Typical usage is changing the window caption:
aWidget->topLevelWidget()->setCaption( "New Caption" );
verstehe nicht ganz, was das damit zu tun hat. Danke Holger -- Ich bin nicht sicher, mit welchen Waffen der dritte Weltkrieg ausgetragen wird, aber im vierten Weltkrieg werden sie mit Stöcken und Steinen kämpfen. --Albert Einstein
Hallo, On Sat, 15 Mar 2003, Holger Macht wrote:
Am Samstag, 15. März 2003 15:33 schrieb David Haller:
On Sat, 15 Mar 2003, Holger Macht wrote:
wie kann ich es erreichen, dass ich auf das MainWIdget von anderen Fenstern , dass in main.cpp mit a.setMainWidget(...) festgelegt wurde, zugreifen kann.
RTFM: qwidget
Habe ich getan ...
If the widget is a top-level, the widget itself is returned. ...
Genau das ist das Problem. Der Returnwert ist NULL bei mir. Ich will ja von einem TopLevelWidget auf das a.setMainWidget zugreifen.
Aehm, von wo aus rufst du denn das neue Fenster auf? Na? ;)) Mach in der Funktion / dem Callback in dem du das neue Fenster aufmachst einfach ein this.topLevelWidget()->hide(); neues_fenster->show(); oder sowas aehnliches. (ob this richtig ist weiss ich nicht, ich habe mir vor Urzeiten QT(1) nur mal angeschaut... Du koenntest auch dem neuen Fenster das MainWindow als Referenz/Zeiger uebergeben, dann kannst du darueber dann zugreifen, dazu kannst du z.B. die von der Klasse des jetzigen Fensters ableiten und einfach noch ne private Variable hinzufuegen. class myWindow : public QMainWindow { private: QMainWindow * app_toplevel_window; public: myWindow(QMainWindow * appw) : QMainWindow() { app_toplevel_window = appw; } /* ... */ this.app_toplevel_window->hide(); } Achtung: ich habe keine Ahnung ob/wie obiges funktioniert -- das ist einfach nur so mal hingetippt. Insbesondere musst du wohl den Konstruktor noch ausbauen.
Typical usage is changing the window caption:
aWidget->topLevelWidget()->setCaption( "New Caption" );
verstehe nicht ganz, was das damit zu tun hat.
Das demonstriert, wie man aus einem child-widget auf Methoden des Topwidgets zugreifen kann... -dnh -- IMHO: "In meinem humpelnden Oberstübchen" ((c) Gerd Hölscher).
On Sat, 15 Mar 2003, Holger Macht wrote:
wie kann ich es erreichen, dass ich auf das MainWIdget von anderen Fenstern , dass in main.cpp mit a.setMainWidget(...) festgelegt wurde, zugreifen kann.
RTFM: qwidget
Habe ich getan ...
If the widget is a top-level, the widget itself is returned.
...
Genau das ist das Problem. Der Returnwert ist NULL bei mir. Ich will ja von einem TopLevelWidget auf das a.setMainWidget zugreifen.
Aehm, von wo aus rufst du denn das neue Fenster auf? Na? ;))
Ich will von dem neu geöffnetet zugreifen
Mach in der Funktion / dem Callback in dem du das neue Fenster aufmachst einfach ein
this.topLevelWidget()->hide(); neues_fenster->show();
Ja, das habe ich schon gemacht. Nur kann ich dann nicht von dem neuen Fenster das ich öffne. Ich muss das mainWidget ja auch wieder anzeigen (show()). Am Montag, 17. März 2003 12:00 schrieb Stefan Hundhammer:
qApp->mainWidget()
qApp ist global.
Habe ich auch schon versucht. Der Rückgabewert von qApp->mainWidget() ist aber NULL. Bekomme auf jeden fall folgende Fehlermeldung wenn ich das Programm starte: QObject::connect: Cannot connect QSignal::signal(const QVariant&) to (null)::show() Danke Holger -- Ich bin nicht sicher, mit welchen Waffen der dritte Weltkrieg ausgetragen wird, aber im vierten Weltkrieg werden sie mit Stöcken und Steinen kämpfen. --Albert Einstein
On Montag, 17. März 2003 17:57, Holger Macht wrote:
qApp->mainWidget()
qApp ist global.
Habe ich auch schon versucht. Der Rückgabewert von qApp->mainWidget() ist aber NULL.
Du mußt natürlich darauf achten, daß die meisten Konstruktoren ausgeführt
werden, bevor Du in main() an die Stelle kommst, wo Du setMainWidget()
aufrufst - das macht man ja üblicherweise, nachdem das Haupt-Widget erzeugt
ist, das dann wieder seinserseits meistens etliche andere Widgets erzeugt
u.s.w.; wahrscheinlich hast Du ein Reihenfolgenproblem.
Überprüf' das mal! Schreib' einfach in die diversen Konstruktoren eine Ausgabe
nach stdout oder stderr und auch an die Stelle, wo Du setMainWidget()
aufrufst, dann siehst Du, was wann drankommt.
CU
--
Stefan Hundhammer
P.S.: Wenn Du ein Reihenfolgeproblem hast, hilft oft QTimer::singleShot()
weiter - Du schreibst dann den Teil, der später drankommen muß, in einen
eigenen Slot, der dann aufgerufen wird, sobald Qt in die Hauptschleife kommt
(QAPPlication::exec()) - dann ist üblicherweise alles initialisiert.
CU
--
Stefan Hundhammer
Am Montag, 17. März 2003 18:27 schrieb Stefan Hundhammer:
Du mußt natürlich darauf achten, daß die meisten Konstruktoren ausgeführt werden, bevor Du in main() an die Stelle kommst, wo Du setMainWidget() aufrufst - das macht man ja üblicherweise, nachdem das Haupt-Widget erzeugt ist, das dann wieder seinserseits meistens etliche andere Widgets erzeugt u.s.w.; wahrscheinlich hast Du ein Reihenfolgenproblem.
Überprüf' das mal! Schreib' einfach in die diversen Konstruktoren eine Ausgabe nach stdout oder stderr und auch an die Stelle, wo Du setMainWidget() aufrufst, dann siehst Du, was wann drankommt.
Habe ich gemacht und ich habe in der Tat ein Reihenfolgeproblem. Am Montag, 17. März 2003 18:46 schrieb Stefan Hundhammer:
P.S.: Wenn Du ein Reihenfolgeproblem hast, hilft oft QTimer::singleShot() weiter - Du schreibst dann den Teil, der später drankommen muß, in einen eigenen Slot, der dann aufgerufen wird, sobald Qt in die Hauptschleife kommt (QAPPlication::exec()) - dann ist üblicherweise alles initialisiert.
Falls ich das, was später ausgeführt werden soll in einen extra Slot schreibe, funktioniert es auch ohne QTimer. Kann es sein, dass immer nur der erste Slot ausgeführt wird Slots in diesem Slot nicht mehr? Das ist nämlich bei mir so. Der zeite Slot kommt erst dran, wenn ich darauf zugreife --> also funktioniert es. Habe aber trotzdem noch eine kleine Frage zu QTimer: WIe prüfe ich denn, wann a.exec() ausgeführt wird? Es siehgt ja so z. B. aus: QTimer::singleShot( 1000, &a, SLOT(quit()) ); Anstelle der Zeit (1000) brauche ich doch ein Signal, oder? Application::exec() ist aber ja keines. Wie realisiere ich das dann? Danke Holger -- Ich bin nicht sicher, mit welchen Waffen der dritte Weltkrieg ausgetragen wird, aber im vierten Weltkrieg werden sie mit Stöcken und Steinen kämpfen. --Albert Einstein
On Dienstag, 18. März 2003 15:11, Holger Macht wrote:
Habe ich gemacht und ich habe in der Tat ein Reihenfolgeproblem.
Dachte ich's mir doch.
Am Montag, 17. März 2003 18:46 schrieb Stefan Hundhammer:
P.S.: Wenn Du ein Reihenfolgeproblem hast, hilft oft QTimer::singleShot() weiter - Du schreibst dann den Teil, der später drankommen muß, in einen eigenen Slot, der dann aufgerufen wird, sobald Qt in die Hauptschleife kommt (QAPPlication::exec()) - dann ist üblicherweise alles initialisiert.
Falls ich das, was später ausgeführt werden soll in einen extra Slot schreibe, funktioniert es auch ohne QTimer.
Äh - na ja, die Idee ist, daß ein Teil der Initialisierung dieses Unterwidgets später ausgeführt wird - eben in einem solchen zusätzlichen Slot. Wenn Du ganz ohne diese Initialisierung auskommst, umso besser.
Kann es sein, dass immer nur der erste Slot ausgeführt wird Slots in diesem Slot nicht mehr?
Verstehe ich nicht ganz, aber tendenziell würde ich sagen "nein". ;-) Du kannst ein Signal mit beliebig vielen Slots verbinden - die werden garantiert alle ausgeführt. Die Reihenfolge der Ausführung ist allerdings undefiniert.
Das ist nämlich bei mir so. Der zeite Slot kommt erst dran, wenn ich darauf zugreife --> also funktioniert es.
???
Habe aber trotzdem noch eine kleine Frage zu QTimer: WIe prüfe ich denn, wann a.exec() ausgeführt wird?
Gar nicht. Du rufst es in main() auf, mehr muß niemanden interessieren.
Es siehgt ja so z. B. aus:
QTimer::singleShot( 1000, &a, SLOT(quit()) );
Anstelle der Zeit (1000) brauche ich doch ein Signal, oder?
Nein. Als Zeit nimmst Du einfach 0, dann wird nach 0 ms der Slot ausgeführt - also bei nächster Gelegenheit, wenn eben app.exec() ausgeführt wird. Was Du dabei gewinnst, ist die Garantie, daß Du zu diesem Zeitpunkt garantiert in der Hauptereignisschleife bist - etwas anderes ist ja app.exec() nicht.
Application::exec() ist aber ja keines. Wie realisiere ich das dann?
Schau' Dir doch mal die Beispiele bei QTimer an, dann wird es glaube ich
deutlicher.
CU
--
Stefan Hundhammer
On Samstag, 15. März 2003 14:43, Holger Macht wrote:
wie kann ich es erreichen, dass ich auf das MainWIdget von anderen Fenstern , dass in main.cpp mit a.setMainWidget(...) festgelegt wurde, zugreifen kann.
qApp->mainWidget()
qApp ist global.
CU
--
Stefan Hundhammer
participants (3)
-
David Haller
-
Holger Macht
-
Stefan Hundhammer