0

Ich habe QTreeView mit einigen Elementen und suche QLineEdit mit verbundenem Steckplatz auf TextEdited Signal. Mit diesem Code:QSortFilterProxyModel Wie man QStandardItems richtig behandelt

QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this); 
proxyModel->setSourceModel(messagesModel); 
proxyModel->setFilterFixedString(text); 
ui.treeView->setModel(proxyModel); 

Text-Filterung ist in Ordnung, aber wenn ich auf QTreeView QStandardItems Kontrollkästchen (nach Proxy-Modell QTreeView zugewiesen) geklickt habe, habe ich die Programmabstürze in Schlitz, die zu diesem QTreeView Urmodell verbunden (bevor der Proxy zugewiesen wurde). Was ist der richtige Weg, um Checkboxen-Klicks zu bearbeiten? Brauche ich neue connect/slot für die Bearbeitung von Modelländerungen, oder kann ich denselben Code für das ursprüngliche Modell mit einigen Änderungen verwenden? Ich muss nur gefilterte Elemente in QTreeView ausblenden. In QTreeWidget ist hide() -Methode, hat QTreeView so etwas oder QSortFilterProxyModel - ist das, was ich brauche? Danke!

UPD abgestürzt in Schlitz, der mit TreeView:

auto item = messagesModel->itemFromIndex(index); // item is NULL because proxyModel is set for TreeView now 
if(item->whatsThis().isEmpty()) return; // error below 

#ifndef QT_NO_WHATSTHIS 
    inline QString whatsThis() const { 
     return qvariant_cast<QString>(data(Qt::WhatsThisRole)); 
    } 
    inline void setWhatsThis(const QString &whatsThis); 
#endif 

weil ich proxyModel zu TreeView gesetzt, aber messagesModel Whatsthis haben ...

+0

Sie einen Absturz haben, als den Code zeigen, der abstürzt. Wenn der abgestürzte Aufruf-Stack nicht auf Ihren Code zeigt, fügen Sie diesen Aufruf-Stack in die Frage ein. –

+0

'treeWidget' - ist es wirklich QTreeView, oder ist es QTreeWidget? –

+0

ja. Entschuldigung - treeWidget muss QTreeView sein. Code mit Absturz angehängt –

Antwort

0

ich meinen Code mit, dass sich geändert:

QStandardItem* item; 
if(ui.leFilter->text().isEmpty()) 
    item = messagesModel->itemFromIndex(index); 
else 
    item = messagesModel->itemFromIndex(proxyModel->mapToSource(index)); 
if(item->whatsThis().isEmpty()) return; 

und es funktioniert. Ist das richtig? Proxy-Modell ist Mitglied meiner Benutzeroberflächenklasse ... nicht lokal.

UPD Wie kann ich das Quellmodell aktualisieren, wenn das Kontrollkästchen in proxyModel aktiviert ist?

UPD 2 Ich habe "Original" -Modell für QtreeView geladen und zeige es. Wenn ich Text in QListEdit bearbeite, benutze ich proxyModel (Code vom 1. Post). Wenn Text bearbeitet wird, habe ich Kontrollkästchen in QtreeView (jetzt ProxyModel ist aktiv) und bei diesem Schritt ist alles in Ordnung. Wenn ich jedoch einige Änderungen an der Benutzeroberfläche vornahm, setzte ich in QTreeView das ursprüngliche Modell und es wurden keine Änderungen für proxyModel vorgenommen. Wie kann ich Objekte im Quellmodell mit neuen Daten von proxyModel benachrichtigen und aktualisieren?

UPD3 Ja-Source-Modell auch modifiziert wird ... Ich habe gerade klar es)

+0

Können Sie mehr Code zur Verfügung stellen oder genauer beschreiben, was Sie wollen? Wie ich verstehe, möchten Sie Ihre Daten im Modell für eine Zeichenfolge filtern, deshalb verwenden Sie QLineEdit für die Eingabe der Filterzeichenfolge und das Festlegen des Proxy-Modells. Ihr QStandardItems ist prüfbar. Aber ich verstehe nicht, "wie kann ich das Quellmodell aktualisieren, wenn das Kontrollkästchen in proxyModel aktiviert ist". Was willst du? Wenn Sie das Kontrollkästchen in QTreeView aktivieren, wird der Status Ihrer QStandartItem-Datei geändert. Es ist Quellmodell. Das Quellmodell wird aktualisiert. –

+0

zweiter Beitrag ist aktualisiert, bitte überprüfen Sie es. –

Verwandte Themen