Seite 1 von 2

Frage zu QAction und QMenu [gelöst]

Verfasst: 1. September 2010 08:21
von reinki0013
Hallo zusammen,

ich bekomme in meiner Funktion eine QAction *action übergeben...

von dieser möchte ich gerne das enthaltene QMenu als QString haben...

meine ansätze waren:

Code: Alles auswählen

void MyClass::ShowAction(ShowAction(QAction *action))
{
  QMenu *menu;
  menu = action->menu();
  QString help = menu->title();
}
leider stürzt das Programm nach der versuchen Zuweisung zum QString ab.

vielleicht könnt ihr mir weiterhelfen...

danke :roll:

Verfasst: 1. September 2010 08:43
von Exasperation
mit QAction::menu() bekommst du nicht das Menu, in welchem die Action steckt, sondern, falls die Action ein weiteres Untermenü öffnet, genau dieses Untermenü.
Returns the menu contained by this action.

Verfasst: 1. September 2010 08:48
von reinki0013
Exasperation hat geschrieben:mit QAction::menu() bekommst du nicht das Menu, in welchem die Action steckt, sondern, falls die Action ein weiteres Untermenü öffnet, genau dieses Untermenü.
Returns the menu contained by this action.
das is ja bei mir der fall...

sieht so aus bei mir:

Code: Alles auswählen

Menü (in Menüleiste)
 - Dokumente - XY.pdf 
 - Zeichnungen - X.ppt
 - Test.pdf
 - Help.doc
und ich würde gerne zurückbekommen, wie das Menü heißt wo XY.pdf enthalten ist...

Verfasst: 1. September 2010 09:01
von Exasperation
Dann hättest du oben aber "das enthaltende QMenu" schreiben müssen ;) Deswegen hab ichs falsch verstanden

Ich schaus mir nochmal an

Verfasst: 1. September 2010 09:02
von upsala
Man könnte sich das ganze auch mal im Debugger anschauen...

Verfasst: 1. September 2010 09:04
von Exasperation

Code: Alles auswählen

void MyClass::ShowAction(ShowAction(QAction *action)) 
Das blick ich net ganz... wieso da der doppelte Aufruf? Oder ist das jetzt für die Frage nicht wichtig? An welcher Stelle bzw. wann soll denn dieser String gesetzt werden?

Verfasst: 1. September 2010 09:05
von Exasperation
upsala hat geschrieben:Man könnte sich das ganze auch mal im Debugger anschauen...
Jap und vielleicht kannst uns sagen, mit welcher Meldung das Programm abstürzt

Verfasst: 1. September 2010 09:13
von reinki0013
Exasperation hat geschrieben:

Code: Alles auswählen

void MyClass::ShowAction(ShowAction(QAction *action)) 
Das blick ich net ganz... wieso da der doppelte Aufruf? Oder ist das jetzt für die Frage nicht wichtig? An welcher Stelle bzw. wann soll denn dieser String gesetzt werden?
also ich weiß auch net was du jetzt damit genau meinst...
diese funktion wird aufgerufen sobald ich auf eine QAction klicke - daher bekomme ich auch die QAction.

Mit dem Debugger anschauen - geht net so wirklich, da es ja abstürzt...

Fehlermeldung:
Unbehandelte Ausnahme bei 0x.... Zugriffsverletzung beim Lesen an Position 0x.....

ich muss danach in dieser funktion ein verzeichnis durchsuchen und es wäre natürlich einfacher, wenn ich den QString vom Menü zurückbekomme, damit ich das Verzeichnis finden kann.

Verfasst: 1. September 2010 10:25
von reinki0013
also was ich nicht ganz verstehe ist, warum nur ich anscheinend das problem habe...

in einem "normalen" 0815-programm benötigt man doch auch öfters in den Menüleisten wieder eine Menüleiste wo dann die gewünschten Sachen bzw. Dokumente ausgewählt werden können. Da brauche ich doch im normalfall überall den Namen der Menüleiste.

wie löst ihr denn das??
oder wie kann ich es am besten lösen?

lg

Verfasst: 1. September 2010 10:56
von Exasperation
Das im Anhang gezeigte möchtest du machen oder?

So... Und dann klickst du dort auf eine in diesem Untermenü vorkommende QAction die eben diese "zuletzt geöffnete" Datei, so nenn ichs mal, darstellt... oder? So und was brauchst du jetzt?

Verfasst: 1. September 2010 11:06
von reinki0013
danke für das bild :-)

ich möchte gerne den Eintrag "Zuletzt geöffnete Dateien" haben...

lg

Verfasst: 1. September 2010 11:20
von Exasperation
Okay, so rein Interesse halber, was soll denn passieren wenn du auf die QAction klickst? Also ich mein, wozu brauchst du denn den Namen von dem Menü? ich frag nur um sicherzugehen dass es vielleicht nicht noch nen leichteren Weg gibt, das zu erreichen was du brauchst :)

Hm also da wäre QAction::menu() eigentlich schon die richtige Wahl, weil man dadurch das Menü bekommt in dem die Action drin steckt...

Hmm also versuch nochmal zu der Stelle hinzudebuggen, schau wo genau er rausspringt und achte darauf ob du vllt auf nicht initialisierte Sachen zugreift oder ein Pointer sonstwohin zeigt...

Verfasst: 1. September 2010 11:36
von reinki0013
also ich brauche den namen aufgrund meiner ordnerstruktur...
ich weiß hört sich kompliziert an, aber es geht net anders...

wenn ich in die funktion springe dann passiert folgendes:

Ich lege QMenu *menu an.
Es bekommt eine Adresse: 0x400000...
Danach erfolgt die Zuweisung: menu = action->menu();
Danach hat allerdings menu die Adresse: 0x00000000
Jetzt möchte ich den QString holen QString test = menu->title();
Wenn ich jetzt weiter debugge, stürzt das programm bei folgender funktion ab:

Code: Alles auswählen

qmenu.cpp

QString QMenu::title() const
{
    return d_func()->menuAction->text();
}
Fehler:
Unbehandelte Ausnahme bei 0x6506050a (QtGuid4.dll) in Programm.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000004[/code]

Verfasst: 1. September 2010 13:33
von reinki0013
und wie konkret kannst du mir da jetzt weiterhelfen??

lg

Verfasst: 1. September 2010 14:29
von Exasperation
Indem ich feststelle, dass wir nicht wussten wie menu() funktioniert ;)

Habs bei mir getestet und hatte den selben Fehler. Hab dann n Zeigerproblem vermutet, aber das wars nicht... Hat alles gestimmt und trotzdem hat mir menu() immer 0 zurückgeliefert...
Und zwar weil eine QAction nicht durch das Hinzufügen zu einem Menu weiß dass das dann sein Menu ist, sondern weil man es (anscheinend) mit QAction::setMenu( QMenu* ) erst setzen muss... :roll:

Wusste nicht, dass das so funktioniert... Wenn jemand meint dass es an was anderem lag kann er gern Bescheid sagen, mich wundert das nämlich grade ziemlich, weil auch in der Doku nichts davon steht, dass man das Menu manuell noch zusätzlich mit setMenu setzen muss.

Setz mal diese Zeile dorthin, wo du auch deine Action zu dem Menu hinzufügst.

Code: Alles auswählen

action->setMenu( my_last_opened_menu ); //hier eben das menu einfügen in welchem sich die action befindet
Und dann versuch nochmal die Funktion aufzurufen in der der String gesetzt werden soll.



/edit:
Oder setzt man mit setMenu das Menu fest, das von einer QAction beinhaltet wird? ich bin verwirrt...