2014-05-12 13 views
6

Sto usando QTreeView per mostrare alcuni dati all'utente. Quello che voglio è attaccare un oggetto reale a ciascun nodo rappresentato usando QStandardItem.Allegare oggetto personalizzato a QStandardItem in Qt

Per salvare il riferimento all'oggetto in QStandardItem:

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

per accedere all'oggetto vero e proprio quando si fa clic nell'interfaccia utente:

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

La chiamata sopra restituisce solo NULL. Qualcuno sa come affrontare un simile requisito?

Non ho trovato assolutamente nulla di utile sul web.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

Per memorizzare l'articolo nel QStandardItem è necessario assicurarsi di aver registrato il proprio tipo con QMetaType. Ad esempio, si potrebbe avere questa definizione:

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 

allora si sarebbe conservarlo in un QVariant in questo modo:

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

Dato un metatipo registrato correttamente per il vostro tipo, ora è possibile fare qualcosa di simile con i tuoi 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); 

E poi estrarlo:

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

Nota: oltre a quanto sopra, è possibile supportare il trascinamento della selezione con tali oggetti personalizzati. Per fare ciò, è necessario registrare gli operatori di flusso per quel tipo con 'qRegisterMetaTypeStreamOperators()', vedere http://qt-project.org/doc/qt-5/qmetatype.html#qRegisterMetaTypeStreamOperators – Googie