Seite 1 von 1

Frage zu ListView

Verfasst: 18. Juni 2009 13:01
von Phorx
Hi,

ich habe ein ListView das mir mit einem QDirModel den Ordnerinhalt eines bestimmten Pfades anzeigt. Funktioniert wunderbar. Jetzt möchte ich aber das wenn eine Datei ( es werden nur Dateien angezeigt ) ein Signal ausgegeben wird. Dazu gibt es ja (denke ich zumindest) CurrentIndexChanged, jedoch weiss ich nicht welche Parameter der haben möchte, hab schon einiges mit currentIndex des ListViews versucht, tuts aber nicht (kommt aber auch kein Fehler).

Also die erste Frage: Was genau muss ich CurrentIndexChanged übergeben?

Das zweite Problem besteht darin das ich den Dateipfad zu der im listview gewählten Datei haben möchte, wie komme ich daran ... im Model und auch im listView ist mir nichts besonders aufgefallen das mir den Dateipfad geben könnte!?

Ich hoffe mir kann jemand helfen :?

Mit freundlichen Grüßen
Phillip

Verfasst: 18. Juni 2009 13:22
von upsala
Beim QAbstractItemView gibt es jede Menge Signale, such dir dort mal das raus, was dir am besten gefällt.

Und beim QDirModel gibts dann z.B. QDirModel::filePath

Verfasst: 18. Juni 2009 13:51
von Phorx
schonmal Danke ... das mit filePath klappt. Das mit

CurrentIndexChanged(QModelIndex &current, QModelIndex &previous)

ist schon das was ich gern als Signal hätte, aber ich hab überhaupt keinen Plan was ich für previous einsetzten soll, für current hab ich bis jetzt immer mit listView->currentIndex() versucht...

was sollte man denn als previous nehmen, damit das Signal richtig ausgegeben wird?

Verfasst: 18. Juni 2009 14:11
von upsala
Wenn du mir jetzt noch verraten würdest, wo du currentIndexChanged in der Doku hast. Ich kann es nicht finden.

Verfasst: 18. Juni 2009 14:24
von Phorx
oh, sorry ... das heisst nur currentChanged ...

Verfasst: 18. Juni 2009 15:03
von upsala
Du sollst das Signal nicht senden, sondern empfangen und somit kannst du previous auch ignorieren.

Verfasst: 18. Juni 2009 20:17
von Phorx
ok... dann sieht das jetzt so aus

Code: Alles auswählen

connect(ui.listView, SIGNAL(currentChanged()), this, SLOT(Dateichange()));
in Dateichange() lasse ich zurzeit einfach nur eine MessageBox ausgeben, jedoch kommt keine MessageBox wenn ich im ListView hoch und runter schalte :(

Wie sähe der Code denn funktionierend aus?

Verfasst: 18. Juni 2009 20:26
von upsala
Was kommt den beim ausführen für eine Fehlermeldung auf der Konsole?

Verfasst: 18. Juni 2009 20:42
von Phorx
das ist ja das problem, es kommen garkeine fehler meldungen, aber es passiert auch nichts.

das gleiche problem habe ich bei einem ganz einfachem clickek Signal von einem Button, da passiert auch nichts. einige andere connects tuen es aber einwandfrei ... ich lad einfach mal die wichtigen codes im anhang hoch, wenn du möchtest kannst du dir die ja vielleicht mal anschauen :)

Verfasst: 18. Juni 2009 23:57
von Phorx
der Fehler mit dem nicht funktionierenden clicked() hat sich nach einem neustart von Visual Studio und dem neuschreiben des connects erledigt ...

aber das QListView gibt mir immer noch kein richtiges Signal.
Wäre klasse wenn mir einfach jemand schreiben könnte, wie ich das mache, dass ein SIGNAL ausgespuckt wird, wenn man im ListView ein anderes Item anklickt...

connect(ui.listView, SIGNAL( ? ? ? ), this, SLOT(machwas()));

Hoffe mir sagt jemand was ich für ? ? ? einsetzen muss, ich verzweifel langsam... :roll:

Vielen Dank schonmal an alle die mir helfen und geholfen haben :)

Verfasst: 19. Juni 2009 09:42
von franzf
Zur Bedienung des Assistant:
Ganz oben steht immer Info zur Klassenhierarchie. Z.B. bei QListView:
Inherited by QHelpIndexWidget, QListWidget, and QUndoView
Wichtiger ist aber das darüber:
Inherits QAbstractItemView.
Da kann man auch draufklicken und sich wichtige Infos zur Basisklasse liefern lassen. Z.B. die Signals, die die Basisklasse ausspuckt.

Dann gibt es auch direkt unter den einzelnen Abschnitten der Methoden eine weitere Auflistung:
Signals

void indexesMoved ( const QModelIndexList & indexes )
6 signals inherited from QAbstractItemView
1 signal inherited from QWidget
1 signal inherited from QObject
Da kann man (welch Wunder) wieder drauf klicken, und man sieht sofort, was man alles machen kann. Und dein Problem sollte sich damit auch lösen lassen.

War jetzt etwas mehr als dir nur die Lösung hin zu knallen, aber es bringt dich hoffentlich weiter...

Verfasst: 19. Juni 2009 10:36
von Phorx
danke für die erklärung des assitenten :) :wink:

ich habe mich dann für

connect(ui.listView, SIGNAL(ui.listView->activated()), this, SLOT(mach()));

entschieden ... allerdings kommt es nicht dazu mach() auszuführen :?
In mach() wird zurzeit nur eine MessageBox ausgeben.

Woran liegt es das nichts passiert, wenn ich in der listView andere Items anklicke und markiere? Laut dem Assistenten sollte ja dabei das Signal ausgelöst werden

Verfasst: 19. Juni 2009 10:44
von franzf
Weil es
1) activated() nicht gibt.
2) der Ausdruck in SIGNAL() komplett falsch ist. Da gehört der Name samt Parametertypen rein, und nicht ein Methodenaufruf zu nem komkreten Objekt oder sonst was!

Und bevor die Rückfrage kommt:
Das Ding heißt
void activated ( const QModelIndex & index )
Drum der connect:

Code: Alles auswählen

connect(ui.listView, SIGNAL(activated(const QModelIndex&)), this, SLOT(mach()));
Und wenn du mit den Daten des ModelIndex auch noch was anstellen willst, gib auch deinem SLOT mach() einen Parameter "const QModelIndex& idx".

Verfasst: 19. Juni 2009 10:52
von Phorx
super! vielen dank.
das man die Parameter (so wie du es gemacht hast) übergeben muss, wusste ich nicht ... dass wird euch hoffentlich einige doofe Fragen meinerseits sparen :wink: