2014-05-12 8 views
6

Ich verwende QTreeView, um dem Benutzer einige Daten anzuzeigen. Was ich will, ist, ein tatsächliches Objekt an jeden Knoten anzuhängen, der QStandardItem darstellt.Anfügen von benutzerdefiniertem Objekt an QStandardItem in Qt

Um den Objektverweis in QStandardItem zu speichern:

QStandardItem *child = new QStandardItem(s); 
child->setFlags(child->flags() & ~Qt::ItemIsEditable); 
child->setData(QVariant(QVariant::UserType, i), Qt::UserRole + 10); 

das eigentliche Objekt zuzugreifen, wenn es in der Benutzeroberfläche angeklickt wird:

void MyOtherClass::handleTreeViewSelectionChanged(const QModelIndex &i) 
{ 
    MyClass* o = i.data(Qt::UserRole + 10).value<MyClass*>(); 
    // do other stuff with o 
} 

Der obige Aufruf NULL nur zurückgibt. Wer weiß, wie man mit einer solchen Anforderung umgehen kann?

Ich fand absolut nichts nützliches im Internet.

Jede Hilfe würde sehr geschätzt werden.

Antwort

5

Um Ihren Artikel im QStandardItem zu speichern, müssen Sie sicherstellen, dass Sie Ihren Typ bei QMetaType registriert haben. Zum Beispiel, könnte man diese Definition haben:

class MyType 
{ 
public: 
    MyType() : m_data(0) {} 
    int someMethod() const { return m_data; } 

private: 
    int m_data; 
}; 

Q_DECLARE_METATYPE(MyType*); // notice that I've declared this for a POINTER to your type 

Dann würden Sie es in ein QVariant speichern etwa so:

MyType *object = new MyType; 
QVariant variant; 
variant.setValue(object); 

ein ordnungsgemäß registriert Metatyp für Ihre Art gegeben, können Sie jetzt etwas tun mit Ihrem QStandardItems:

MyType *object = new MyType; 
QStandardItemModel model; 
QStandardItem *parentItem = model.invisibleRootItem(); 
QStandardItem *item = new QStandardItem; 
item->setData(QVariant::fromValue(myType)); // this defaults to Qt::UserRole + 1 
parentItem->appendRow(item); 

Und dann später extrahieren:

void MyOtherClass::handleTreeViewSelectionChanged(const QModelIndex &i) 
{ 
    MyType* o = i.data(Qt::UserRole + 1).value<MyType*>(); 
    // do other stuff with o 
} 
+1

Beachten Sie, dass Sie zusätzlich zu den oben genannten Funktionen Drag & Drop mit diesen benutzerdefinierten Objekten unterstützen möchten. Um dies zu tun, müssen Sie Stream-Operatoren für diesen Typ mit 'qRegisterMetaTypeStreamOperators()' registrieren, siehe http://qt-project.org/doc/qt-5/qmetatype.html#qRegisterMetaTypeStreamOperators – Googie