ich habe letztens mein eigenes Popup-Menü geschrieben, welches sich bei einem Klick auf die rechte Maustaste
öffnet. Der Aufbau der Menüelemente sieht wie folgt aus:
1. Headertext für darauf folgenden Kontext [fix = wird immer angezeigt]
2. Hinzufügen von (QAction*)-Elementen aus einem std::vector [dynamisch]
3. Headertext für darauf folgenden Kontext [fix]
4. Hinzufügen eines (QAction*)-Elements [fix]
Info: Alle Elemente sind QAction*-Elemente, von welchen, bis auf die beiden Headertexte, alle 'enabled' sind.
Über ein mouseReleaseEvent überprüfe ich, ob innerhalb meines Widgets die rechte Maustaste betätigt
wurde. Sobald das geschieht, wird eine Funktion namens "setPopupMenu" aufgerufen, welche (bis jetzt)
jedes mal das gesamte Menü neu aufsetzt/überarbeitet (Löschen und neu anlegen aller nicht 'fixen' Elemente)
und anschließend anzeigt.
Um auf eine Auswahl eines Menüelements zu reagieren, wird an eine Funktion namens "popupSelection" das
entsprechende (QAction*)-Element übergeben, was ich über das setzen von CONNECTIONS in der Funktion
"setPopupWindow" realisiert habe.
Das sieht bis jetzt so aus:


Vorweg eine Frage, ob mein bisheriger Quellcode optimal ausgearbeitet ist?
=> auch Verbesserungsvorschläge sind sehr erwünscht
[Basic elements]
Code: Alles auswählen
QMenu* popupMenu;
QAction* header; // dummy; not relevant for selection
std::vector<QAction*> partners;
QAction* header2; // dummy; not relevant for selection
QAction* autoScroll;
Code: Alles auswählen
void mouseReleaseEvent(QMouseEvent* event) {
if(event->button() == Qt::RightButton) {
// Adjust header text according to item count
if(this->partners.size() > 0)
this->header->setText("Hide partners:");
else
this->header->setText("Hide partners: <none>");
// Show popup menu
popupMenu->popup(this->cursor().pos());
}
}
Code: Alles auswählen
void MessagePool::setPopupMenu() {
if(popupMenu != NULL)
delete popupMenu;
popupMenu = new QMenu;
popupMenu->setStyleSheet("QMenu { color: rgb(244, 244, 244);"
"background-color: rgb(40, 40, 40);"
"border: 1px solid orange;}"
"QMenu::item:disabled { color: orange; }"
"QMenu::item:disabled:selected { background-color: none}"
"QMenu::item:selected { background-color: rgb(120, 120, 120);}");
popupMenu->addAction(header);
popupMenu->addSeparator();
// Add vector items
for(int i=0; i<partners.size(); i++)
popupMenu->addAction(partners.at(i));
popupMenu->addSeparator();
popupMenu->addAction(header2);
popupMenu->addSeparator();
popupMenu->addAction(autoScroll);
connect(popupMenu, SIGNAL(triggered(QAction*)), this, SLOT(popupSelection(QAction*)));
}
Code: Alles auswählen
void MessagePool::popupSelection(QAction* action) {
// In case of std::vector elements
if(/* ... */) {
// ... treat the elements checked state
}
// In case of the "autoScroll" Element
else {
// ... treat the elements checked state
}
}
(A) Bislang wird das Popup-Menu erst dann geschlossen, wenn man entweder ein Element auswählt (angklickt) oder
man außerhalb der Menufläche die linke Maustaste betätigt.
=> Wie richtet man es nun ein, das das Menu erst dann verschwindet, wenn man mit dem Mauszeiger eine bestimmte
Zeit (sagen wir 0.5 Sekunden) die Fläche verlässt?
(B) [wenn A erfolgreich implementiert wurde] Wie kann ich für alle 'aktiven' (selektierbaren) (QAction*)-Elemente es so
einrichten, das deren Selektion nicht das Menü verschwinden lässt? (Um mehrere Auswahlen in einem Durchgang zu machen)