habe folgendes Problem:
Habe eine Baumstruktur, diese besteht aus TreeLeafs und TreeNodes (beides erbt von ITreeElement). Die drei Header Dateien hab ich als Attachments angehängt. Diese Baumstruktur soll in einem QTreeView-Widget dargestellt werden.
Dazu habe ich das untenstehende TreeModel geschrieben.
Leider wird im TreeView keine Knoten bzw nichts angezeigt.
Enschuldigt die vielen qDebugs, ich hab versucht so viele Infos zu bekommen wie möglich um das evtl selber lösen zu können.
Hier also das TreeModel
Code: Alles auswählen
#include "interface/ITreeElement.h"
#include "TreeNode.h"
#include "TreeLeaf.h"
#include "../model/interface/IVariable.h"
#include "TreeWidgetModel.h"
using namespace MIG;
TreeWidgetModel::TreeWidgetModel(QObject *parent) : QAbstractItemModel(parent) {
qDebug("TreeWidgetModel::TreeWidgetModel(QObject)");
rootNode = 0;
}
TreeWidgetModel::TreeWidgetModel(ITreeElement* root, QObject *parent) : QAbstractItemModel(parent) {
qDebug("TreeWidgetModel::TreeWidgetModel(ItreeElement, QObject");
rootNode = root;
}
TreeWidgetModel::~TreeWidgetModel() {
}
void TreeWidgetModel::setRootNode(ITreeElement *node) {
qDebug("TreeWidgetModel::setRotNode");
rootNode = node;
reset();
}
//Is used to access a child of a given parent.
QModelIndex TreeWidgetModel::index(int row, int column, const QModelIndex &parent) const {
qDebug("TreeWidgetModel::index - requested row=%d, colum=%d, parent= %p", row, column, &parent);
QModelIndex childIndex = QModelIndex();
if (parent.isValid() ) {
qDebug(" Parent node is Valid");
ITreeElement* parentElement = nodeFromIndex(parent);
int nrChildren = parentElement->getChildren()->count();
if ( nrChildren >= row ) {
qDebug(" Parent node has %d Children", nrChildren);
childIndex = createIndex(row, column, parentElement->getChildAt(row) );
} else {
qDebug(" Parent node is not Valid");
}
}
qDebug("TreeWidgetModel::index - returnig row %d , column %d ChildIndex=%p", childIndex.row(), childIndex.column(), &childIndex);
return childIndex;
}
QModelIndex TreeWidgetModel::parent(const QModelIndex &childIndex) const {
qDebug("TreeWidgetModel::parent");
ITreeElement* node = nodeFromIndex(childIndex);
if (!node) return QModelIndex();
ITreeElement* parentNode = node->getParent();
if(!parentNode) return QModelIndex();
ITreeElement* grandParentNode = parentNode->getParent();
if (!grandParentNode) return QModelIndex();
int row = grandParentNode->getChildren()->indexOf(parentNode);
// return createIndex(row, child.column(), parentNode);
return createIndex(row, 0, parentNode);
}
int TreeWidgetModel::rowCount(const QModelIndex &parent) const {
qDebug("TreeWidgetModel::rowCount");
int amount = 0;
ITreeElement* parentNode = nodeFromIndex(parent);
if (parentNode) amount = parentNode->getChildren()->count();
qDebug("TreeWidgetModel::rowCount - returning %d for parent %p", amount, &parent);
return amount;
}
int TreeWidgetModel::columnCount(const QModelIndex &parent) const {
qDebug("TreeWidgetModel::ColumnCount");
return 4;
}
QVariant TreeWidgetModel::data(const QModelIndex &index, int role) const {
qDebug("TreeWidgetModel::data");
return QString("TEST");
if (role != Qt::DisplayRole) return QVariant();
ITreeElement* node = nodeFromIndex(index);
if (!node) return QVariant();
return QVariant(tr("test"));
if (!node->hasChildren() ) {
qDebug("TreeWidgetModel::data - !node->hasChildren");
switch (index.column() ) {
case 0:
return "Test";
// return ((TreeLeaf*)node)->getVariable()->getName();
break;
case 1:
return "Value";
break;
case 2:
return "Enabled";
break;
case 3:
return "Description";
break;
default:
return "ERROR";
break;
}
} else if (node->hasChildren() ) {
qDebug("TreeWidgetModel::data - !node->hasChildren");
if (index.column() == 0 ) {
qDebug("TreeWidgetModel::data - index.column == 0");
return "Test";
return (node->getName() );
}
}
return "test";
}
QVariant TreeWidgetModel::headerData(int section, Qt::Orientation orientation, int role) const {
//headers << "Name" << "Value" << "Enabled" << "Description";
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
switch(section) {
case 0:
return tr("Name");
break;
case 1:
return tr("Value");
break;
case 2:
return tr("Enabled");
break;
case 3:
return tr("Description");
break;
}
}
return QVariant();
}
ITreeElement* TreeWidgetModel::nodeFromIndex(const QModelIndex &index) const {
qDebug("TreeWidgetModel::nodeFromIndex - row: %d, colum: %d", index.row(), index.column());
ITreeElement* element = rootNode;
if (index.isValid() ) {
element = static_cast<ITreeElement*>(index.internalPointer() );
qDebug("TreeWidgetModel::nodeFromIndex - valid ");
}
return element;
}
Qt::ItemFlags TreeWidgetModel::flags(const QModelIndex &index) const {
qDebug("TreeWidgetModel::flags");
if (!index.isValid() )
return Qt::ItemIsEnabled;
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
Hier stelle ich auch mal den Auschnitt der erstellten Elemente des Baumes hin. Eigentlich wird der Baum von einer Fabrik gebaut. Dieser dient nur der Fehler elimination.
Code: Alles auswählen
IVariable* var = new SimpleVariable();
var->setName("TestVar");
rootNode = new TreeNode();
TreeNode* node1 = new TreeNode();
TreeNode* node2 = new TreeNode();
TreeNode* node3 = new TreeNode();
TreeLeaf* leaf11 = new TreeLeaf(node1, var);
TreeLeaf* leaf12 = new TreeLeaf(node1, var);
TreeLeaf* leaf21 = new TreeLeaf(node2, var);
TreeLeaf* leaf22 = new TreeLeaf(node2, var);
TreeLeaf* leaf31 = new TreeLeaf(node3, var);
node1->setName("Node1");
node2->setName("Node2");
node3->setName("Node3");
leaf11->setName("LEAF11");
leaf12->setName("LEAF12");
leaf21->setName("LEAF21");
leaf22->setName("LEAF22");
leaf31->setName("LEAF31");
rootNode->addChild(node1);
rootNode->addChild(node2);
rootNode->addChild(node3);
node1->addChild(leaf11);
node1->addChild(leaf12);
node2->addChild(leaf21);
node2->addChild(leaf22);
node3->addChild(leaf31);
myTreeModel->setRootNode(rootNode);
und hier mal der Anfang meiner Debugausgaben, das wiederholt sich dann immer wieder.
Code: Alles auswählen
TreeWidgetModel::setRotNode
TreeWidgetModel::ColumnCount
TreeWidgetModel::ColumnCount
TreeWidgetModel::ColumnCount
TreeWidgetModel::rowCount
TreeWidgetModel::nodeFromIndex - row: -1, colum: -1
TreeWidgetModel::rowCount - returning 3 for parent 0xbfc66d10
TreeWidgetModel::ColumnCount
TreeWidgetModel::rowCount
TreeWidgetModel::nodeFromIndex - row: -1, colum: -1
TreeWidgetModel::rowCount - returning 3 for parent 0xbfc66cac
TreeWidgetModel::ColumnCount
TreeWidgetModel::rowCount
TreeWidgetModel::nodeFromIndex - row: -1, colum: -1
TreeWidgetModel::rowCount - returning 3 for parent 0xbfc66cac
TreeWidgetModel::index - requested row=0, colum=0, parent= 0xbfc66cac
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66c6c
TreeWidgetModel::index - requested row=1, colum=0, parent= 0xbfc66cac
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66c6c
TreeWidgetModel::index - requested row=2, colum=0, parent= 0xbfc66cac
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66c6c
TreeWidgetModel::rowCount
TreeWidgetModel::nodeFromIndex - row: -1, colum: -1
TreeWidgetModel::rowCount - returning 3 for parent 0xbfc66d10
TreeWidgetModel::ColumnCount
TreeWidgetModel::ColumnCount
TreeWidgetModel::index - requested row=-1, colum=0, parent= 0xbfc66bc0
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66b30
TreeWidgetModel::index - requested row=-1, colum=1, parent= 0xbfc66bc0
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66b30
TreeWidgetModel::index - requested row=-1, colum=2, parent= 0xbfc66bc0
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66b30
TreeWidgetModel::index - requested row=-1, colum=3, parent= 0xbfc66bc0
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66b30
TreeWidgetModel::index - requested row=-1, colum=0, parent= 0xbfc66bc0
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66b30
TreeWidgetModel::index - requested row=-1, colum=1, parent= 0xbfc66bc0
TreeWidgetModel::index - returnig row -1 , column -1 ChildIndex=0xbfc66b30
Hoffe das mich jemand in die richtige Richtung stoßen kann. Sollte ich Infos vergessen haben bitte kurz sagen was benötigt wird.
Ich bin da jetzt schon fast ne Woche daran und bin für jede Hilfe dankbar.
Liebe Grüße
Andy[/quote]