Click auf QMenu abfangen

Verschiedenes zu Qt
Antworten
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Click auf QMenu abfangen

Beitrag von huckleberry »

Hallo Leute,

ich habe ein Main Menu oben im Programm a la:
File, Edit, Help etc.

diese haben Kinder, beispiel File:
File
.+--> Neu...
.+--> Öffnen
.+--> Zuletzt geöffnete
.........+--> datei1.dat
.........+--> datei2.dat
.........+--> datei3.dat
.+--> Beenden

Neu, Öffnen und Beenden sind QActions. Das "Zuletzt geöffnete" is eine QMenu wie "File", welchem ich dynamisch Kinder-QActions (hier datei*.dat, nämlich die zuletzt geöffneten) hinzufüge. Dies funktioniert auch ganz gut.

Zusätzlich dazu würde ich gerne einen eigenen SLOT ausführen, wenn ich auf "Zuletzt geöffnete" clicke, anstatt auf dessen Kinder zu clicken (was ja wie gesagt funktioniert).

Code: Alles auswählen

  connect(ui->menuZuletzt_Geoffnet, SIGNAL(triggered(QAction*)), this, SLOT(slotZuletztGeoffnet(QAction*)));
und dann beispielsweise:

Code: Alles auswählen

void MainWindow::slotZuletztGeoffnet(QAction* action)
{
  qDebug() << "Test Trigger";
}
Es tut sich nichts, bzw. der Slot wird nur ausgeführt, wenn ich auf eines der Kinder datei*.dat clicke. Weil vlt. hier http://doc.qt.io/qt-5.5/qmenu.html#triggered :
Note: This signal is emitted for the main parent menu in a hierarchy. Hence, only the parent menu needs to be connected to a slot; sub-menus need not be connected.
Wüsste jemand wie ich es machen könnte? Vielen Dank schon mal..

LG Huckleberry
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Click auf QMenu abfangen

Beitrag von veeman »

Suchst du vielleicht http://doc.qt.io/qt-5.5/qmenu.html#aboutToShow um vor dem Anzeigen der Elemente die Liste dynamisch zu füllen?
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Re: Click auf QMenu abfangen

Beitrag von huckleberry »

veeman hat geschrieben:Suchst du...
Ne das wars nicht. Ich habe die Kinder von "Zuletzt geöffnete" schon erfolgreich gefüllt (mit QActions) und beim klick auf diese Kinder werden die entsprechenden zuletzt geöffneten Dateien "reopened". ==> Wenn ich auf die Kinder vom QMenu 'Zuletzt geöffnete' klicke, funktioniert alles prima.

Ich möchte aber zusätzlich auf das QMenu 'Zuletzt geöffnete' (was Kind vom QMenu 'File' ist) clicken können um einen seperaten SLOT auszulösen.
Wenn ich das Signal aboutTtoShow() nehme, wird schon bvereits beim drüber hoovern, der SLOT ausgelöst. Das wäre ja schon der Fall wenn ich zu den erwähnten Kindern will.

Ich suche sowas:

Code: Alles auswählen

connect(ui->menuZuletzt_Geoffnet, SIGNAL(triggered()), this, SLOT(onZuletzt_Geoffnet()));
Nur gibts das SIgnal clicked() oder pressed() oder triggered() nicht für ein QMenu.. bzw. nur mit dem Parameter QAction*

Code: Alles auswählen

connect(ui->menuZuletzt_Geoffnet, SIGNAL(triggered(QAction*)), this, SLOT(onZuletzt_Geoffnet(QAction*)));
was aber auch nicht auslöst mit

Code: Alles auswählen

void MainWindow::onZuletzt_Geoffnet(QAction* action)
{
  qDebug() << "TRIGGERED";
  if (action) {
    qDebug() << "onZuletzt_Geoffnet" << action->data().toString();
  }
}
Es würde gehen, wenn 'Zuletzt Geoffnete' eine QAction wäre, anstatt einer QMenu. Aber eine QAction kann keine Kinder haben, weswegen ich dann die QActions an zuletzt geöffneten Dateien nicht 'zuletzt Geoffnet' hinzufügen kann.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Click auf QMenu abfangen

Beitrag von veeman »

Der Grund für ein solches Verhalten wird mir nicht ganz klar.

Du hast dafür zwei Möglichkeiten:
entweder du leitest QMenu ab und implementierst dein Signal das beim klicken getriggert wird,
oder du installierst ein eventFilter für das gegeben Objekt und reagierst da auf den Mausklick.
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Re: Click auf QMenu abfangen

Beitrag von huckleberry »

veeman hat geschrieben:Der Grund für ein solches Verhalten wird mir nicht ganz klar.
+ Klick auf die Kinder (QActions) von 'Zuletzt geöffnet' öffnet zuletzt geöffnete Dateien.. (funzt)
+ Klick auf das 'Zuletzt geöffnet' selbst (was ja vom Typ QMenu ist) soll ein Dialogfenster öffnen (wo ich beispielsweise die Anzahlt der Zuletzt geöffneten Dateien einstellen kann)
veeman hat geschrieben:entweder du leitest QMenu ab und implementierst dein Signal das beim klicken getriggert wird,
Also eine neue Klasse implementieren die von QMenu erbt ?
Antworten