Qt: Eintrag in QListWidget markieren
-
Moin moin,
ich habe zwei QListWidget und möchte in beiden immer den gleichen Eintrag selektiert haben. Also in QListWidget 1 werden alle Einträge angezeigt und in QListWidget 2 nur eine Auswahl (durch einen Filter eingestellt). Nun möchte ich, dass wenn in QListWidget 2 ein Eintrag durch den Nutzer angewählt wird, dieser auch in der Gesamtliste QlistWidget 1 markiert und angezeigt wird.Meine Idee war wie folgt:
Ich nehme current aus dem Signal "currentItemChanged" und habe dazu folgendes geschrieben.
liste1->setCurrentItem(current);
bzw
liste1->scrollToItem(current);
Beides funktioniert leider nicht.
Wie bekomme ich das aber hin?
Meine zweite Frage wäre wie ich einen Eintrag (QString) in einer QListWidget suchen und markieren kann. Auch da bin ich zur Zeit anscheinend ein wenig Blind.
NavySeabear
-
werden beide QListWidget von gleichen model mit Daten gefüttert?
Oder wie werden die beiden Views mit Daten gefüllt?EDIT: wegen der Suche. Das QListWidget hat die methode findItems damit solltest du zu mindestens das finden hinbekommen.
-
firefly schrieb:
werden beide QListWidget von gleichen model mit Daten gefüttert?
Oder wie werden die beiden Views mit Daten gefüllt?ich hoffe ich habe die Frage richtig verstanden.Also, beide QListWidgets sind in der gleichen Klasse und auch im gleichen QMainWindow. Da sie beide auf den gleichen Datenbestand zugreifen sollte es auch von der Seite keine Probleme geben.
-
Das reicht nicht, wie genau werden die beiden Views mit Daten gefüttert?
(Am besten zu zeigst die entsprechenden Code zeilen)
-
firefly schrieb:
Das reicht nicht, wie genau werden die beiden Views mit Daten gefüttert?
(Am besten zu zeigst die entsprechenden Code zeilen)ui->hersteller_List->clear(); dbklasse.set_query("SELECT * FROM hersteller ORDER BY hersteller",4); if (dbklasse.first(4)) { do { ui->hersteller_List->addItem(dbklasse.get_data(1,4)); } while (dbklasse.next(4)); }
dbklasse.set_query("SELECT * FROM hersteller WHERE (hersteller LIKE '%" + ui->Such_Edit->text() + "%' OR Beschreibung LIKE '%" + ui->Such_Edit->text() + "%') ORDER BY hersteller",6); ui->Search_List->clear(); if (dbklasse.first(6)) { do { ui->Search_List->addItem(dbklasse.get_data(1,6)); } while (dbklasse.next(6)); }
So werden beide QListWidget's befüllt. Oder was meinst Du??
-
navy_seabear schrieb:
ui->hersteller_List->clear(); dbklasse.set_query("SELECT * FROM hersteller ORDER BY hersteller",4); if (dbklasse.first(4)) { do { ui->hersteller_List->addItem(dbklasse.get_data(1,4)); } while (dbklasse.next(4)); }
dbklasse.set_query("SELECT * FROM hersteller WHERE (hersteller LIKE '%" + ui->Such_Edit->text() + "%' OR Beschreibung LIKE '%" + ui->Such_Edit->text() + "%') ORDER BY hersteller",6); ui->Search_List->clear(); if (dbklasse.first(6)) { do { ui->Search_List->addItem(dbklasse.get_data(1,6)); } while (dbklasse.next(6)); }
So werden beide QListWidget's befüllt. Oder was meinst Du??
Genau das wollte ich wissen :).
Das mit setCurrentItem funktioniert so nicht, wie du es dir dachtest, da du in beiden Views unterschiedliche QListWidgetItem hast.
Durch addItem(QString) (ich vermute get_data liefert einen string zurück oder?) wird intern ein neues QListWidgetItem erzeugt.
Um das gleiche Element im hersteller_List zu selektieren, welches im Search_List vom Benutzer selektiert wurde, musst du das entsprechende QListWidgetItem erst finden, welches du dann mit setCurrentItem aktivieren kannst.
-
firefly schrieb:
Genau das wollte ich wissen :).
Das mit setCurrentItem funktioniert so nicht, wie du es dir dachtest, da du in beiden Views unterschiedliche QListWidgetItem hast.
Durch addItem(QString) (ich vermute get_data liefert einen string zurück oder?) wird intern ein neues QListWidgetItem erzeugt.
Um das gleiche Element im hersteller_List zu selektieren, welches im Search_List vom Benutzer selektiert wurde, musst du das entsprechende QListWidgetItem erst finden, welches du dann mit setCurrentItem aktivieren kannst.OK, das mit den zwei QListWidgetItem habe ich verstanden. Nun aber meine Frage, wie mache ich das nun? Und ja, get_data liefert ein QString zurück.
-
Du suchst einfach das element mit findItems im anderen ListView. Und verwendest dann das QListWidgetItem, welches findItems zurückliefert für die selektion des entsprechenden Elementes.
Das funktioniert aber nur, wenn die Elemente im ListView eindeutig sind.
-
firefly schrieb:
Du suchst einfach das element mit findItems im anderen ListView. Und verwendest dann das QListWidgetItem, welches findItems zurückliefert für die selektion des entsprechenden Elementes.
Das funktioniert aber nur, wenn die Elemente im ListView eindeutig sind.Ich hänge schon wieder / immer noch.
Wenn ich versuche mit findItems zu arbeiten:
QListWidgetItem XX = ui->hersteller_List->findItems(ui->hersteller_Edit->text(),0);
bekomme ich als Fehlermeldung:
Fehler:conversion from ‘QList<QListWidgetItem*>’ to non-scalar type ‘QListWidgetItem’ requested
Was mache ich falsch?
-
steht doch da. findItems liefert eine List von QListWidgetItems zurück.
Aber das steht auch in der API dokumentation zu QListWIdget
http://doc.qt.nokia.com/4.7-snapshot/qlistwidget.html
-
Das einfachste sollte doch sein, mit einer View zusammen mit einem QSqlQueryModel zu arbeiten. Wenn das rechte Widget nur eine Auswahl zeigen solle, setz einfach ein QSortFilterProxyModel (oder eben ein eigenes Proxymodel). Mit mapToSource/mapFromSource kannst du in deinen Slots (wenn jemand ein Item in der linken oder rechten View angeklickt hat) auf das entsprechende Model/ProxyModel zugreifen.