QTreeWidget - Hinzufügen einer Referenz in setData

Alles rund um die Programmierung mit Qt
Antworten
Thomas_Z
Beiträge: 4
Registriert: 2. März 2010 10:24

QTreeWidget - Hinzufügen einer Referenz in setData

Beitrag von Thomas_Z »

Ich will in einem QTreeWidgetItem eine Referenz zu einem Objekt in setData hinzufügen, da ich beim anklicken, den ausgewählten Knoten, aktivieren will.

Momentan nehme ich die ID (ist später nicht mehr brauchbar) zum testen.

BeispielCode:

QTreeWidgetItem *twi_tbi = new QTreeWidgetItem();
CometNodeVariant *itemVariant = new CometNodeVariant(QVariant::STRING);
itemVariant->setValue(node);
// funktioniert nicht twi_tbi->setData(0,Qt::UserRole, itemVariant);
/* -> wegen Testzwecke */ twi_tbi->setData(0,Qt::UserRole, node->nodeId());

itemVariant ist von QVariant abgeleitet und besitzt zusätzlich eine ObjectReferenz zu einem Knoten des Types CometSvgNode.
Ist der Ansatz QVariant zu erweitern eher falsch? Ich hab gelesen diese Klasse soll nicht erweitert werden.

Wie werden Referenzen in einem QTreeWidgetItem, bzw. QTreeWidget gehandhabt? Ist das Signal Slot Konzept zu verwenden?
SIGNAL clicked beim QTreeWidget
SLOT activate beim Knoten?

Ich Danke um Hilfe,

Thomas
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QTreeWidget - Hinzufügen einer Referenz in setData

Beitrag von franzf »

Thomas_Z hat geschrieben:Ist der Ansatz QVariant zu erweitern eher falsch? Ich hab gelesen diese Klasse soll nicht erweitert werden.
QVariant hat keinen virtuellen Destruktor. Du verwendest QVariant über Basisklassenreferenzen/Values. Das KANN nur schief gehen.
Das ist übrigens das selbe Problem, wenn du anfängst std::list oder andere STL-Container abzuleiten, das ist NICHT vorgesehen.

Was spricht denn dagegen, einfach in verschiedenen dataroles deine Daten abzulegen?

Code: Alles auswählen

twi_tbi->setData(0,Qt::UserRole+1, nodeId);
twi_tbi->setData(0,Qt::UserRole+2, cometSvgNodePtr);
// usw.
Thomas_Z
Beiträge: 4
Registriert: 2. März 2010 10:24

Beitrag von Thomas_Z »

es würde nichts dagegen sprechen, nur hab ich da zu wenig Ahnung. Ich hab einfach mal angefangen das zu bauen und nun steck ich.
Wie kann ich in die DataRoles daten ablegen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Thomas_Z hat geschrieben:Wie kann ich in die DataRoles daten ablegen?
Hab ich dir in dem Codebeispiel gezeigt ;)
Musst dir nur merken, welchen Offset du für welchen Wert verwendest.
Thomas_Z
Beiträge: 4
Registriert: 2. März 2010 10:24

Beitrag von Thomas_Z »

ich bekomm da:

void CometSvgTree::startAddSvgNode(CometSvgNode *node){
//NEW TREE ITEM

QTreeWidgetItem *twi_tbi = new QTreeWidgetItem();
twi_tbi->setData(0,Qt::UserRole+1, node);

}

nen fehler:
____________________-
c:\Qt\2010.02\qt\include/QtCore/../../src/corelib/kernel/qvariant.h:425: error: 'QVariant::QVariant(void*)' is private
____________________-
C:/Users/Arbeit/Documents/Qt_Projects/Comet_1_0_0_2/Comet_Handler/svg/cometsvgtree.cpp:75: error: within this context
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Google -> "store pointer in QVariant"
u.A.
-> http://doc.trolltech.com/4.6/qvariant.h ... tFromValue
Thomas_Z
Beiträge: 4
Registriert: 2. März 2010 10:24

Beitrag von Thomas_Z »

genau das war es!

Zirka die Lösung, falls es wen interessiert:

das setzen der Reference:

QVariant data = qVariantFromValue(node);
qVariantSetValue(data, node);
twi_tbi->setData(0,Qt::UserRole, data);
____________________________________

das lesen der Reference:


QTreeWidgetItem *item = currentItem();

QVariant dataID = item->data(0,Qt::UserRole);

CometSvgNode *nodeRef = qVariantValue<CometSvgNode *>(item->data(0, Qt::UserRole));

if(nodeRef != NULL)
nodeRef->activate();
____________________________________

in der <headerdatei.h>:

Q_DECLARE_METATYPE(CometSvgNode*)



vielen Dank für die Hilfe
Antworten