gpt4 book ai didi

c++ - QAbstractItemModel 对索引/父函数和数据函数感到困惑

转载 作者:行者123 更新时间:2023-11-30 02:59:16 25 4
gpt4 key购买 nike

我有以下简单的模型示例:

#include <QtGui/QApplication>
#include <QtGui/QTreeView>
#include <QAbstractItemModel>

class TestModel : public QAbstractItemModel
{
public:
TestModel()
{
SetUpData();
}

virtual QModelIndex index(int row, int column, const QModelIndex& parent) const
{
if ( parent.isValid())
{
// child
return createIndex( row, column, (void*)&mData[row].mChildren[column]);
}
// root
return createIndex( row, column, (void*)&mData[row]);
}

virtual QModelIndex parent(const QModelIndex& child) const
{
ModelData* data = (ModelData*)child.internalPointer();

// find out where "data" is in the mData vector structure
for ( size_t i=0; i<mData.size(); ++i )
{
for ( size_t j=0; j<mData[i].mChildren.size(); ++j )
{
if ( &mData[i].mChildren[j] == data )
{
// I think this is correct, return the parent row at col 0?
return createIndex( i, 0, (void*)&mData[i].mChildren[j]);
}
}
}
return QModelIndex();
}

virtual int rowCount(const QModelIndex& parent) const
{
if ( parent.isValid() )
{
// Per root node size
return mData[parent.row()].mChildren.size();
}

// Root size
return mData.size();
}

virtual int columnCount(const QModelIndex& parent) const
{
// The "parent" nodes should have two columns, the children should have 1
if ( parent.isValid() )
{
// Root
return 1;
}
// Children
return 2;
}

virtual QVariant data(const QModelIndex& index, int role) const
{
if ( role == Qt::DisplayRole && index.isValid() )
{
if ( index.isValid() )
{
// I think col and row are the wrong way around, but will crash if swapped
return mData[index.column()].mChildren[index.row()].mName;
}
else
{
// this never happens because "RootN" is never displayed
return mData[index.column()].mName;
}
}
return QVariant();
}

private:
// The "real" data that this Qt model is providing an interface to
struct ModelData
{
QString mName;
std::vector< ModelData > mChildren;
};

std::vector< ModelData > mData;

void SetUpData()
{
for ( int i=0; i<3; ++i )
{
ModelData root;
root.mName = "Root" + QString::number( i+1 );

for ( int j=0; j<10; ++j )
{
ModelData node;
node.mName = "Node" + QString::number( j+1 );
root.mChildren.push_back( node );
}
mData.push_back( root );
}
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

TestModel* model = new TestModel();
QTreeView* tv = new QTreeView();

tv->setModel( model );
tv->show();

int ret = a.exec();

delete tv;
delete model;

return ret;
}

我在这里要做的是创建一个具有以下结构的模型:

Root1
|-Node1-10
|
Root2
|-Node1-10
|
Root3
|-Node1-10

然而我最终得到的是:

output

我真的很困惑索引/父级和数据应该如何工作。显然我不明白,因为我的输出不正确。

我认为,例如,Root1、Node3 会导致使用 row = 0、col=2 调用索引,此时我使用 0,2 和指向该元素的指针调用 createIndex?

对于 parent(),如果父元素有效则返回 QModelIndex,因为这意味着它是一个 RootN 元素,如果父元素不是根元素,则返回 createIndex 以创建父元素的索引。

最后,对于数据,我认为这只是返回给定行/列的 UI 的显示字符串?

最佳答案

I thought that for example, Root1, Node3 would cause index to be called with row = 0, col=2, at which point I call createIndex with 0,2 and the pointer to that element?

没有。您的树只有两列:第 0 列显示树层次结构,第 1 列再次显示标签。所以调用 col 2 是无效的。

Root1, Node3 应该有一个 row=2 col=(1/2, 无论你想要哪个) 和一个父索引等于 row=0, col=(1/2) 和一个无效的父(一个无效的父意味着你处于根级别)。

什么 data(..) 返回取决于什么 role 传递给它,参见 documentation对于您应该感兴趣的类型。

关于c++ - QAbstractItemModel 对索引/父函数和数据函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13030223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com