QTreeWidgetItem finden, hellblau markieren und an erster Stelle in Liste setzen



  • Hallo,

    gegeben ist ein QTreeWidget, dass ausschließlich mit Top Level QTreeWidgetItem's gefüllt ist.

    Im QTreeWidget soll ein Item gesucht und markiert werden. Was mir bislang nur so gelungen ist:

    QString Item = "GesuchtesItem";
    int ColumnNumber = 3;
    QList<QTreeWidgetItem *> itemList = ui->treeWidget->findItems(GesuchtesItem, Qt::MatchStartsWith, ColumnNumber);
    if (itemList.size() > 0)
       ui->treeWidget->setCurrentItem(itemList[0]);
    

    Das gefundene Item wird jedoch in grauer und nicht wie gewünscht in hellblauer Farbe markiert. Außerdem steht es am Ende des Fensters, obwohl es nicht am Ende der Liste steht. Ich würde es aber gerne am Anfang oder Mitte des QTreeWidget Fensters anzeigen lassen.

    Fragen dazu:
    1. Ist das der einfachste Weg (siehe Code) ein Item zu markieren / selektieren?

    2. Wie kann das Item in hellblauer Farbe markiert werden? Muss es dazu noch zusätzlich selektiert werden? Wie wird ein Item selektiert?



  • Mit setCurrentItem bekommt das Element den Eingabefokus. Zum Selektieren musst du das SelectionModel verwenden (QAbstractItemView::selectionModel). Wie das genau geht, musst du in der Doku nachschauen, weiß ich grad nicht auswendig. Da gibts glaub ich auch Flags, dass das Element dann sichtbar sein soll, sowas wie ensureVisible. Das ItemView muss auch eine ensureVisible Funktion haben.
    Obs dann aber am Anfang oder am Ende des Fensters angezeigt wird, kann man so ohne weiteres nicht beeinflußen, das müsste man selber machen. Irgendwie mit visualRect und die Scroll Position manuell ändern.



  • Es geht nur darum, das das gefundene Item nicht wie jetzt grau, sondern hellblau markiert (die Farbe, die ein Mausklick auf ein Item auslöst) angezeigt werden soll.

    Ob es selektiert ist ist unwichtig. Es geht nur um die hellblaue Farbmarkierung.

    Wie wird das gemacht?

    Irgendwie habe ich die Vermutung, dass nur der Fokus auf das Item fehlt. Denn wenn ich nach dem Quellcode (siehe oben) einen Debugger Haltpunkt setze, wird das markierte Item wie gewünscht hellblau markiert angezeigt. (Ist nur eine Vermutung).



  • Das wird dadurch gemacht, dass das Item selektiert wird. Beim Zeichnen wird geprüft, obs selektiert ist, und dann wird die selection color verwendet.



  • Mechanics schrieb:

    Das wird dadurch gemacht, dass das Item selektiert wird.

    Ah, verstehe - dass war mir nicht klar.

    Das Selektieren mit "QAbstractItemView::selectionModel" scheint mir aber sehr kompliziert zu sein. Werde aus der Dokumentation nicht schlau und habe auch nirgends im Netz ein Beispiel dazu gefunden.



  • Was ist daran kompliziert? Hab jetzt doch in die Doku geschaut, hat einen Slot select

    ui->treeWidget->selectionModel()->select(index, QItemSelectionModel::Select);

    irgendwie so.



  • Bin ja noch Anfänger.

    Mir fehlt zu Deinem Code der Index Parameter. Setze ich den beispielsweise auf "2":

    ui->treeWidget->selectionModel()->select(2, QItemSelectionModel::Select);

    Erhalte ich folgende Compilerwarnung:

    Fehler: C2664: "void QItemSelectionModel::select(const QItemSelection &,QItemSelectionModel::SelectionFlags)" : Konvertierung von Argument 1 von "int" in "const QModelIndex &" nicht möglich



  • Habe die Lösung mittlerweile gefunden. Es war ein Fokus Problem. Da das QTreewWidget in einem QWidget neben einigen QCheckboxes plaziert ist, die im Code auch noch abgefragt werden, rauben sie möglicherweise den Fokus. Mit folgendem Code mit "ui->treeWidget->setFocus" in der letzten Zeile wird das item gefunden und mit highlight markiert:

    QString Item = "GesuchtesItem";
    int ColumnNumber = 3;
    QList<QTreeWidgetItem *> itemList = ui->treeWidget->findItems(GesuchtesItem, Qt::MatchStartsWith, ColumnNumber);
    if (itemList.size() > 0)
       ui->treeWidget->setCurrentItem(itemList[0]);
    ui-treeWidget->setFocus();
    

    Folgender Code funkioniert übrigens auch:

    ui->treeWidget->topLevelItem(0)->setSelected(true);  // Erste Reihe markieren
    ui-treeWidget->setFocus();
    

    Wie das markierte item in der Mitte des QTreeWidget Fensters plaziert wird habe ich auch herausgefunden:

    QAbstractItemView::ScrollHint hint = QAbstractItemView::PositionAtCenter;
    ui->treeWidget->scrollToItem(itemList[0], hint);
    

    Trotzdem danke für die Hilfe Mechanics. "ui->treeWidget->selectionModel()->select(index, QItemSelectionModel::Select)" werde ich sicher noch einml benötigen.



  • Der index ist ein QModelIndex, den brauchst du im Zusammenhang mit Item Views und Models ständig. QTreeWidget::findItems gibt dir ja offensichtlich (ich benutze nie die Widget Klassen, nur die View Klassen, z.B. QTreeView) QTreeWidgetItems zurück. Mit indexFromItem kannst du den in einen QModelIndex umwandeln.


Log in to reply