Popup Menü mit beliebig viele Elemente

Alles rund um die Programmierung mit Qt
Antworten
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Popup Menü mit beliebig viele Elemente

Beitrag von Allroad »

Hallo miteinander,

Ich hab nun folgendes Problem: ich möchte einen Popup-Menü erstellen, wobei ich nicht weiss wieviele 'Aktionen' mein Menü hat (das hängt von der Anzahl an Dateien in einem Ordner; die Aktionen in dem Menü sind die Namen der Dateien). Das habe ich soweit wie folgt gelöst:

Code: Alles auswählen

QMenu *menu = new QMenu();
...
QAction *newAction=0;

for(int i =0; i<size; i++) //size ist die Anzahl der Datein in einem Folder
     newAction = menu->addAction(tr(specList[i].c_str())); //vector<string> specList : ist also ein vector von strings die in Form von Aktionen in dem Menü dargestellt werden;  
...
Das funktioniert sogar, allerdings kann ich nicht mehr rausfinden welche Aktion (hier Dateiname) der Benutzer ausgewählt hat... da ich ja nur eine QAction-Variable definiert habe...
Kann ich das irgendwie aus der menu-Variable rausfinden, oder habt ihr grundsätzlich ne andere Idee?

Danke!
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

vllt. sowas wie ein QVector< QAction* > in der klasse und eine methode, die als parameter z.b. einen string entgegennimmt und entsprechend einen QAction-pointer erstellt, der dann im vector abgelegt wird?

Code: Alles auswählen

// [ .. ]
private:
Qvector< QAction* > actionVec;
void addMenuAction( const QString &str )
{
  QAction *tmpAction;
  tmpAction = menu->addAction( str );
  actionVec.push_back( tmpAction );
}
ich habe mich nicht naeher damit beschaeftigt, also gibt es vllt. etwas sinnvolleres/eleganteres, das waer aber meine erste idee.
den inhalt der methode kannst du natuerlich auch direkt in der for-schleife haben.

mfg,
julian
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag von Allroad »

hmm.. klingt eingentlich gut... Danke! Ich versuchs mal so, es sollte eigentlich klappen!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Verwende QAction::data() und setData()
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag von Allroad »

@upsala: verstehe trotzdem nicht wie mir das weiterhelfen soll beim rausfinden welche Aktion der Benutzer geklickt hat... .
@Freaky: das mit dem Vektor von Aktionen hilft mir auch nicht weiter!

Allgemein muss ich das neu überdenken. ich habe nur einen einzigen slot zur Verfügung.

Code: Alles auswählen

public slot: LoadFile(std::string& fileName);
... und leider geht das so wie ich es mir vorgestellt habe nicht...:

Code: Alles auswählen

for(i =0; i<size;i++)
{
fileName = specList[i]
connect(newAction, SIGNAL(triggered()), this, SLOT(LoadSpec(std::string fieName)));
}
Also in dieser Richtung würde ich gehen (oder so ähnlich), nur weiss ich nicht wie ich LoadSpec() mit dem richtigen Parameter aufrufen soll....
Darf ich den Slot überhaupt so definiern?(std::string& fileName) oder muss ich fileName weglassen...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Allroad hat geschrieben: Darf ich den Slot überhaupt so definiern?(std::string& fileName) oder muss ich fileName weglassen...
Doku - das hatten wir schon zig Mal.
Außerdem sind wir in Qt - warum also std::string ??

Ich würde mir mal QSignalMapper anschauen - macmans Idee ist es in data() deinen String aus der Datei zu speichern zwecks späterer Zuordnung.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Christian81 hat geschrieben:macmans Idee ist es in data() deinen String aus der Datei zu speichern zwecks späterer Zuordnung.
Ich wüsste nicht das ich überhaupt schon eine Idee dazu geäussert hätte :-) Jedenfalls empfehle ich allen Neulingen mal die Examples durch zu gehen. Oft findet man da schon was Ähnliches und kann aus der Lösung was für sich ableiten. In diesem Fall käme wohl das recentFiles-Example in Frage. Da gibt es auch ein dynamisches Menü, bei dem man herausfinden muss, welcher Eintrag angeklickt wurde.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag von Allroad »

so... hat geklappt! Danke für die Hilfe!
Antworten