2016-03-25 17 views
3

Ich habe eine QSortFilterProxyModel, die von meinem QML-Code aus zugänglich ist. Ich benutze es in einem ListView in meinem QML-Code, aber ich möchte auch auf das erste Element davon außerhalb meiner ListView zugreifen.Wie kann ich auf QSortFilterProxyModel-Elemente in QML außerhalb eines ListView zugreifen

Nehmen wir an, ich rufe meine QSortFilterProxyModelsortedObjects. In der ListView übergeben Sie es einfach an die model Eigenschaft, wie model: sortedObjects und dann in der delegate Eigenschaft kann ich auf seine Rollen zugreifen, durch die angegebenen Rollennamen. Wie kann ich dies außerhalb einer ListView tun? So etwas wie sortedObjects[0].someRoleName.

Antwort

1

Wie @mcchu in seinem Beitrag darauf hingewiesen, gibt es eine Funktion index genannt ist und data in QSortFilterProxyModel. Leider wenn ich diese Funktionen aufzurufen, auf meinem QSortFilterProxyModel in QML versuchen, dann bekomme ich folgende Fehlermeldung:

TypeError: Property 'index' of object QSortFilterProxyModel(0x7fcff0c2af90) is not a function 

daher als this Post vorgeschlagen. Ich habe eine separate C++ - Klasse erstellt, die einen Const-Zeiger von meinem QSortFilterProxyModel empfängt und eine Funktion erstellt, die dann die index und data Funktionen umschließt und den gewünschten Wert zurückgibt. Diese Klasse ist registriert, so dass sie aus dem QML-Code aufgerufen werden kann. Hier

ist der Code:

class SomeClass : public QObject { 
    Q_OBJECT 
public: 
    SomeClass(const QSortFilterProxyModel* sortedModel) { 
     m_sortedModel = sortedModel; 
    } 

    Q_INVOKABLE QVariant getValue() { 
     QVariant someTypeRole = m_sortedModel->data(m_sortedModel->index(0, 0), SomeModelClass::SomeRoles::SomeTypeRole); 
     if (someTypeRole.isValid()) { 
      return type = someTypeRole.toString(); // I know it is a QString for sure, but there are mechanisms to find out the type of the role 
     } 

     return QVariant(); 
    } 

private: 
    const QSortFilterProxyModel* m_sortedModel; 
}; 

EDIT:

Wie @Mitch wies darauf hin, in seinem Kommentar @ mcchu-Lösung funktioniert, aber nur von Qt 5.5.

3

QSortFilterProxyModel ist ein QAbstractItemModel. Und in QAbstractItemModel, können Sie das Element im Modell zugreifen, indem Aufruf zwei Q_INVOKABLE Funktionen in QML:

  1. index ein QModelIndex, und dann
  2. data den Wert einer Rolle in diesem Index bekommen

Angenommen, der Hash-Wert someRoleName ist 1234 (definiert in roleNames in Ihrem Modell). Sie können den Wert von someRoleName in Zeile 0 erhalten wie die folgende Funktion in QML (und Spalte 0, wenn das Modell eine Liste ist):

function printSomeRoleNameInRow0() 
{ 
    var row = 0, col = 0, someRoleName = 1234; 
    var idx = sortedObjects.index(row, col); 
    var value = sortedObjects.data(idx, someRoleName); 
    console.log(value); 
} 
+0

Vielen Dank für Ihre Antwort! Ich dachte mit der gleichen Logik, was Sie oben erklärt haben, aber ich bekomme 'TypeError: Property 'Index' des Objekts QSortFilterProxyModel (0x7fcff0c2af90) ist keine Funktion'. Ich beende es, indem ich eine C++ - Klasse erstelle, die einen Const-Zeiger von meinem 'QSortFilterProxyModel' empfängt und grundsätzlich dasselbe tut. Dann registriere ich es, damit ich es von QML aus aufrufen kann. Ich werde meine Lösung in ein paar Minuten veröffentlichen. – Silex

+3

@Silex, die Funktionen wurden nur in Qt 5.5 aufrufbar gemacht, obwohl niemand erwarten konnte, dass Sie das wissen, weil es leider keinen Änderungsprotokolleintrag und keine Dokumentation gab, die das widerspiegeln. – Mitch

+0

Das ist eine wirklich nützliche Information @Mitch, Danke! – Silex