Qt

2014-05-12 20 views
6

için QStandardItem özel nesnesini iliştirin Kullanıcıya bazı verileri göstermek için QTreeView kullanıyorum. İstediğim şey, QStandardItem kullanılarak temsil edilen her bir düğüme gerçek bir nesne eklemektir. Qt

QStandardItem içine nesne başvurusu kaydetmek için: o arayüzünde tıklandığında

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

gerçek nesneye erişmek için:

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

yukarıdaki çağrı sadece NULL döndürür. Böyle bir gereksinimle nasıl başa çıkılacağını bilen var mı?

Web'de kesinlikle yararlı hiçbir şey bulunamadı.

Herhangi bir yardım çok takdir edilecektir.

cevap

5

Öğenizi QStandardItem içinde saklamak için, türünüzü QMetaType ile kaydettiğinizden emin olmanız gerekir.

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 

Sonra şöyle bir QVariant içine kaydetmişizdir: Örneğin, bu tanım olabilir türüne uygun bir düzgün kayıtlı metatype Verilen

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

, artık böyle bir şey yapabiliriz senin QStandardItems ile: sonra

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); 

Ve daha sonra ayıklamak:

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

Not: Yukarıdakilere ek olarak, bu özel nesnelerle Drag & Drop uygulamasını desteklemek isteyebilirsiniz. Bunu yapmak için, "qRegisterMetaTypeStreamOperators()' ile bu tür akış operatörleri kaydetmeniz gerekir, bkz. Http://qt-project.org/doc/qt-5/qmetatype.html#qRegisterMetaTypeStreamOperators – Googie