Frage zu ListView

Alles rund um die Programmierung mit Qt
Antworten
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Frage zu ListView

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn du mir jetzt noch verraten würdest, wo du currentIndexChanged in der Doku hast. Ich kann es nicht finden.
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag von Phorx »

oh, sorry ... das heisst nur currentChanged ...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du sollst das Signal nicht senden, sondern empfangen und somit kannst du previous auch ignorieren.
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was kommt den beim ausführen für eine Fehlermeldung auf der Konsole?
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag 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 :)
Dateianhänge
projekt.rar
Alle wichtigen Code-Dateien
(6.29 KiB) 112-mal heruntergeladen
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag 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 :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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".
Phorx
Beiträge: 29
Registriert: 21. Mai 2009 22:36
Kontaktdaten:

Beitrag 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:
Antworten