Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem mit QPopupMenu



Kirsche
27-07-2005, 15:14
Hallo Leute,

ich möchte meinem Poup-Menü "windowMenu" flexibel Einträge hinzufügen und daraus wieder entfernen, je nachdem welche Fenster gerade geöffnet sind.
Es sollen also neu geöffnete Fenster eingetragen und gerade geschlossene wieder gelöscht werden. Wenn man auf einen Eintrag klickt, soll das entsprechende Fester aktivert werden.
Dabei gibt es ein paar Probleme:
1.
In dem Menü gibt es Einträge, die immer da sein sollen ( "z.B close all windows"). Da es sich um QActions handelt, die nicht mit "insert" eingefügt werden können, haben diese keine manuell gesetzten Ids. Kann ich sicher sein, dass die automatisch generierten immer negativ sind?
2. Meine Einträge mache ich anhand der Namen, die in der Fensterliste des Workspaces stehen: QWidgetList windows = mdi->windowList( QWorkspace::CreationOrder ); und dann windows.at( i )->caption() innerhalb einer Schleife. Macht man das so?
3. Sobald ich ein Fenster schließe, muss ich den entsprechenden Eintrag löschen. Das Ereignis fange ich über einen Eventfilter ab. Allerdings weiß ich dann nicht, welches Fester geschlossen wurde und welchen Eintrag ich löschen muss.
4. Wenn ich einen Eintrag lösche, stimmen hinterher die Ids nicht mehr mit den Einträgen in der Festerliste überein, weil die alten Ids beibehalten werden, die Liste sich aber geändert hat. Muss ich das Menü "windowMenu" jedesmal komplett neu aufbauen? Wie lösche ich dann alle variablen Einträge und behalte die festen bei?

Wie kann man das ganze sinnvoll gestalten? In anderen Programmen klappt es doch auch. Ich habe mich irgendwie verzettelt. :confused:

Vielen Dank,

anda_skoa
28-07-2005, 11:55
Ich würde eher das Menü immer vor dem Anzeigen neu aufbauen.
Zuerst clear() und dann einfügen wie beim ersten Mal.

Es durch Löschen einzelner Einträge aktuell zu halten zahlt sich bei der vermutlich geringen Anzahl von Einträgen eigentlich nicht aus.

Dann hast du auch keine Probleme mit dem Mapping von gerade geschlossenen Fenster auf Menu ID.

Ciao,
_

Kirsche
29-07-2005, 11:36
Hallo anda_skoa,

danke für deine Hilfe. Ich habe es jetzt so realisiert, wie du es gesagt hast. Das Problem ist nur, dass das zu schließende Fenster noch in der Windows-Liste steht, wenn ich das Menü wieder aufbaue. Darum bleibt es im Menü, bis ich das nächste Fenster schließe, das dann auch wieder zu lange im Menü bleibt. Ich denke, es liegt daran, dass der Event-Filter zwar auf das Ereignis reagiert, es aber erst ausführt, wenn der Filter beendet wurde. Wie kann ich erreichen, dass das Fenster erst geschlossen wird, damit ich das Menü korrekt aufbauen kann?

Ich habe mir auch schon überlegt, dass die Fenster, die ich schließe, ein Signal senden, dass sie geschlossen werden, aber ich denke, dass dabei die gleiche Zeitverzögerung auftritt, oder? Sie senden erst und werden dann geschlossen.

Schöne Grüße,

anda_skoa
29-07-2005, 11:49
Versteh ich jetzt leider nicht ganz.

Wie schließt du das Fenster während das Menü offen ist?

Ciao,
_

Kirsche
29-07-2005, 12:40
Hallo anda_skoa,

ich habe einige Fenster innerhalb meines Workspaces offen. Wenn ich eines davon schließe, wird ein Close-Event dafür ausgelöst. Dieses fange ich mit einem Event-Filter ab, um darauf zu reagieren. Zu dem Zeitpunkt ist das Fenster vermutlich noch nicht wirklich geschlossen. Ich erstelle mein Menü neu und greife dabei auf die Windows-Liste des Workspaces zu. Dort steht aber noch das Fenster drin, das eigentlich gerade geschlossen wird. Dadurch trage ich es wieder in mein Menü ein. Anschließend wird es wirklich erst geschlossen und steht fälschlicherweise noch in meinem Menü.

Habe ich eine andere Möglichkeit, um auf das Close-Event des Fensters zu reagieren? :confused:

Noch eine andere Frage zu einem alten Thema( ich weiß zwar nicht, ob ich es nicht in dem anderen Thema fragen sollte, aber ich war nicht sicher, ob das dort noch gelesen wird):
Ich habe in einer Tabelle selbsterstellte Items (genannt TableItem, abgeleitet von QTableItem). Wenn ich später mit table->item() darauf zugreife, bekomme ich nur QTableItem* statt TableItem* zurück und kann somit nicht auf meine eigenen Funktionen zugreifen. Wie löse ich das Problem? :confused:

Vielen Dank,

anda_skoa
01-08-2005, 13:11
Habe ich eine andere Möglichkeit, um auf das Close-Event des Fensters zu reagieren? :confused:

Du brauchst nicht auf das CloseEvent zu reagieren, wenn du das Menü beim Öffnen neu aufbaust.
Siehe Signal aboutToShow()

In diesem Moment sind nur Fenster in der Liste, die auch offen sind.



Noch eine andere Frage zu einem alten Thema( ich weiß zwar nicht, ob ich es nicht in dem anderen Thema fragen sollte, aber ich war nicht sicher, ob das dort noch gelesen wird):

Der Thread wird dann wieder nach vorne gestellt und anders markiert.
Ist besser in einem Thread zu fragen, der schon Bezug zur Frage hat.


Wenn ich später mit table->item() darauf zugreife, bekomme ich nur QTableItem* statt TableItem* zurück und kann somit nicht auf meine eigenen Funktionen zugreifen. Wie löse ich das Problem? :confused:


Casten :)



TableItem* item = static_cast<TableItem*>(table->item());


Oder zuerst auf ein QTableItem zuweisen,, dessen rtti() prüfen und dann casten, oder bei aktiviertem C++ rtti einen dynamic_cast benutzen

Wenn du allerdings sicher nur deine eigene QTableItem Subklasse im Table hat, kannst du es so wie oben machen.

Ciao,
_

Kirsche
04-08-2005, 14:55
Hallo anda_skoa,

vielen Dank für deine Hilfe. Ich habe gerade deine Tipps ausprobiert (vorher hatte ich leider keine Zeit). Es klappt alles. AboutToShow ist wirklich eine elegante Lösung. static_cast klappt auch. Ich hatte zuerst einfach nur (TableItem) zum Casten davor geschrieben, aber das ging nicht (klappt vielleicht nur bei int und so).

Schöne Grüße, :)

anda_skoa
05-08-2005, 13:07
Ich hatte zuerst einfach nur (TableItem) zum Casten davor geschrieben, aber das ging nicht (klappt vielleicht nur bei int und so).


Da hat nur nicht funktioniert, weil das der falsche Typ ist.
item() liefert ja einen Pointer auf ein Item, der C-Style Cast müßte also auch auf einen Pointertyp casten, also hier (TableItem*)

Allerdings sollte man wann immer möglich die C++ Casts benutzen.

Ciao,
_

Kirsche
05-08-2005, 16:19
Hallo anda_skoa,

daran habe ich nicht gedacht. Danke für den Hinweis.

Schöne Grüße,