Eigenes Popup-Fenster ausbauen/optimieren

Alles rund um die Programmierung mit Qt
Antworten
MADsCIENTIST

Eigenes Popup-Fenster ausbauen/optimieren

Beitrag von MADsCIENTIST »

Hallo liebe Community,

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:
BildBild

Vorweg eine Frage, ob mein bisheriger Quellcode optimal ausgearbeitet ist?
=> auch Verbesserungsvorschläge sind sehr erwünscht :wink:

[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;
[Mouse-Event]

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());

	}

}
[For setting the popup menu [or] recreating the popup menus content]

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*)));
}
[SLOT for tracking menu element selection]

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

	}
	
}
Wenn es nichts zu verbessern gibt, dann komme ich jetzt zu meinen eigentlichen Fragen.

(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)
MADsCIENTIST

Re: Eigenes Popup-Fenster ausbauen/optimieren

Beitrag von MADsCIENTIST »

Interessant, keiner einen Vorschlag?
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Eigenes Popup-Fenster ausbauen/optimieren

Beitrag von veeman »

Was ist daran Interessant? Du misshandelst hier Objekte für (im Prinzip) komplett andere Zwecke. Ggf. wäre es vl. Sinnvoller dafür ein Window/Widget-System aufzusetzen mit dem wünschtem verhalten, da die Popup-Menüfelder dafür nicht ausgelegt werden sind -> Standard OS-Verhalten. ...aber es gibt immer Wege und Mittel.
MADsCIENTIST

Re: Eigenes Popup-Fenster ausbauen/optimieren

Beitrag von MADsCIENTIST »

Ich war mir bis jetzt auch nicht sicher ob das dafür am geeignetsten ist, aber als Notlösung für
den Anfang hat es ausgereicht. Also du würdest das ganze jetzt eher mit einem QWidget
bewerkstelligen!

Welche weiteren Bauelemente empfielst du noch?
QCheckBox und QLabel in einem Container für jedes Item?

PS: Mit "interessant" meinte ich, das bislang keiner geschrieben hat :D
Antworten