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

Beitrag von reinki0013 »

Exasperation hat geschrieben: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...
also hab jetzt folgendes getestet:

Code: Alles auswählen

QMenu *menu;
action->setMenu(menu);
menu = action->menu();
QString test = menu->title();
jetzt stürzt das programm nicht ab, aber ich bekomme lediglich die ausgewählte action zurück, und nicht das menü in dem die action sitzt...
oder hab ich das falsch verstanden?
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Ich hab geschrieben
action->setMenu( my_last_opened_menu ); //hier eben das menu einfügen in welchem sich die action befindet
Du sollst an der Stelle an der du deine action anlegst action->setMenu() aufrufen, also nicht erst in der Funktion in der du den String holst. Sondern dort wo eben deine action entsteht und in ein Menü eingehängt wird.

So.

Und an der Stelle rufst du auch noch action->setMenu auf und übergibst dort auch diese Menü in das du deine Action einfügst...

Du wirst ja bestimmt irgendwo ein mein_tolles_menu->addAction( action ) haben oder? Und dort musst du auch setMenu machen...

Bin mir da allerdings nicht mehr so sicher, aber versuchs mal
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

okay, sorry war mein fehler, hab das übersehen...

ich habe jetzt in der funktion "FillMenu" nach

Code: Alles auswählen

action->setText("test");
action->setMenu(menu);
menu->addAction(action);
und jetzt habe ich das Problem, das meine QAction keine action mehr ist, sondern ein Menü...
also mit einem Pfeil auf der rechten seite...
das problem is natürlich jetzt, das es ein menu is und keine action mehr, daher komme ich natürlich auch nicht mehr in meine Funktion hinein.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Okay dann verwerf die idee... war mein fehler...



Also das heißt. Was macht setMenu? Es weißt einer Action ein Menü als Untermenü zu. Also wenn du zB ne Action hast die "last_opened_files_action" heißt, dann kannst du ihr das zuvor erstellte Menü "last_opened_files_menu" zuweisen und hast eben dieses untermenü... Das bringt uns aber jetzt wenig... Aber wir wissen jetzt dass man mit menu() nicht an das ÜBER-Menü kommt, sondern FALLS eine Action ein weiteres Menü öffnet, dann kommt man eben an dieses Menü....

Das heißt mit menu() kommst du da an den Namen des Menüs in dem sich die Action befindet nicht ran...

Ich (bzw du auch) überleg mir was dann meld ich mich wieder.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

So... also... habs mal bei mir getestet....

hier füge ich eine meiner actions einem Menu hinzu... Dass menu hat übrigens den Titel "Help"...

Code: Alles auswählen

m_about_action = new QAction( "About", m_help_menu );
m_help_menu->addAction( m_about_action );
So.. ich hab also dem Action als sein parent das menu zugewiesen in dem sie sich befindet...

jetzt kann ich mit QAction::parentWidget() auf das parent der action zugreifen, caste das dann noch runter weil ich ein QWidget* bekomme aber ein QMenu* bekomme, hol mir von dem den title() und voilà hab ich in meinem String den Namen des Menus.

Code: Alles auswählen

QString my_str = ( (QMenu*)m_about_action->parentWidget() )->title();
Nach der Zeile steht in my_str: "Help"
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

Exasperation hat geschrieben:So... also... habs mal bei mir getestet....

hier füge ich eine meiner actions einem Menu hinzu... Dass menu hat übrigens den Titel "Help"...

Code: Alles auswählen

m_about_action = new QAction( "About", m_help_menu );
m_help_menu->addAction( m_about_action );
So.. ich hab also dem Action als sein parent das menu zugewiesen in dem sie sich befindet...

jetzt kann ich mit QAction::parentWidget() auf das parent der action zugreifen, caste das dann noch runter weil ich ein QWidget* bekomme aber ein QMenu* bekomme, hol mir von dem den title() und voilà hab ich in meinem String den Namen des Menus.

Code: Alles auswählen

QString my_str = ( (QMenu*)m_about_action->parentWidget() )->title();
Nach der Zeile steht in my_str: "Help"
Fetten RESPEKT !!!
da haut es mir fast die :shock: raus...

Funktioniert perfekt, es is echt super das es so leute wie dich in dem Forum gibt, die einem so super weiterhelfen, besten Dank nochmal!

schönen tag noch,

:D
Antworten