[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions_content.php on line 1014: Undefined array key 3
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions_content.php on line 1014: Undefined array key 3
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions_content.php on line 1014: Undefined array key 3
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions_content.php on line 1014: Undefined array key 3
qtforum.de • Popup Menü mit beliebig viele Elemente
Seite 1 von 1

Popup Menü mit beliebig viele Elemente

Verfasst: 22. April 2008 17:23
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!

Verfasst: 22. April 2008 17:54
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

Verfasst: 22. April 2008 17:58
von Allroad
hmm.. klingt eingentlich gut... Danke! Ich versuchs mal so, es sollte eigentlich klappen!

Verfasst: 22. April 2008 18:47
von upsala
Verwende QAction::data() und setData()

Verfasst: 23. April 2008 11:17
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...

Verfasst: 23. April 2008 11:34
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.

Verfasst: 23. April 2008 12:05
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.

Verfasst: 23. April 2008 17:14
von Allroad
so... hat geklappt! Danke für die Hilfe!