cast-Verächter - Handhabung QVariant bei Model-View-Programm
Verfasst: 29. März 2006 17:09
Hallo,
ich habe mich von dem QT-Beispiel "simpletreemodel" inspirieren lassen und habe eine Baumansicht programmiert. Mein Baum besteht aus verketteten Objekten, die von TreeNode abgeleitet sind. Die Funktion getTreeNode() soll mir einen Zeiger auf so einen Knoten liefern. Dazu muß data() bemüht werden.
So richtig leuchtet mir die Verwendung von QVariant nicht ein. Am Ende lande ich doch bei typlosen Zeigern.
Beispielsweise liefert ein Klick auf ein Baumelement dessen Index. Aus diesem Index muß ich einen Zeiger auf das tatsächliche Objekt basteln.
Ohne wilde "Castereien" komme ich da nicht hin, obwohl folgendes Programm funktioniert:
Geht das nicht schöner, sicherer und eleganter. Ich könnte evtl. statt void-Zeigern QObject-Zeiger nehmen, aber viel besser wäre das auch nicht. Überhaupt ist mir QVariant etwas suspekt...
Danke für jeden sachdienlichen Hinweis!
ich habe mich von dem QT-Beispiel "simpletreemodel" inspirieren lassen und habe eine Baumansicht programmiert. Mein Baum besteht aus verketteten Objekten, die von TreeNode abgeleitet sind. Die Funktion getTreeNode() soll mir einen Zeiger auf so einen Knoten liefern. Dazu muß data() bemüht werden.
So richtig leuchtet mir die Verwendung von QVariant nicht ein. Am Ende lande ich doch bei typlosen Zeigern.
Beispielsweise liefert ein Klick auf ein Baumelement dessen Index. Aus diesem Index muß ich einen Zeiger auf das tatsächliche Objekt basteln.
Ohne wilde "Castereien" komme ich da nicht hin, obwohl folgendes Programm funktioniert:
Code: Alles auswählen
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid()) return QVariant();
if(role == Qt::UserRole)
return qVariantFromValue(index.internalPointer());
return QVariant();
}
TreeNode *TreeModel::getNode(const QModelIndex &index)
{
void *qobj;
QVariant variant = data(index, Qt::UserRole);
if(qVariantCanConvert<void *>(variant))
qobj = qVariantValue<void *>(variant);
return static_cast<TreeNode *>(qobj);
};
Danke für jeden sachdienlichen Hinweis!