Frage zu QAction und QMenu [gelöst]

Alles rund um die Programmierung mit Qt
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Frage zu QAction und QMenu [gelöst]

Beitrag 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:
Zuletzt geändert von reinki0013 am 2. September 2010 07:32, insgesamt 1-mal geändert.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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.
Zuletzt geändert von Exasperation am 1. September 2010 08:59, insgesamt 2-mal geändert.
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag 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...
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Dann hättest du oben aber "das enthaltende QMenu" schreiben müssen ;) Deswegen hab ichs falsch verstanden

Ich schaus mir nochmal an
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Man könnte sich das ganze auch mal im Debugger anschauen...
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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?
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag 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.
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag 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
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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?
Dateianhänge
menu.png
menu.png (18.11 KiB) 8501 mal betrachtet
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

danke für das bild :-)

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

lg
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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...
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag 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]
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

und wie konkret kannst du mir da jetzt weiterhelfen??

lg
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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...
Antworten