C++ Qt Qml错误:无法将[undefined]分配给Qml TreeView的子类QAbstractItemModel中的QString

C++ Qt Qml错误:无法将[undefined]分配给Qml TreeView的子类QAbstractItemModel中的QString,c++,qt,treeview,qml,qt-creator,C++,Qt,Treeview,Qml,Qt Creator,我尝试为QML树视图创建自定义模块,我使用SimpelTeeVIEW示例作为基础,但我总是得到“unabe将[unDe]分配给qStand”。 以下是您可能需要的一些信息: Qml: C++: #包括“structuredatamodel.h” structureDataModel::structureDataModel(QObject*parent) :qabstractemmodel(父级) { QList根数据; rootData子级(row); 如果(子项) 返回createIndex

我尝试为QML树视图创建自定义模块,我使用SimpelTeeVIEW示例作为基础,但我总是得到“unabe将[unDe]分配给qStand”。

以下是您可能需要的一些信息:

Qml:

C++:

#包括“structuredatamodel.h”
structureDataModel::structureDataModel(QObject*parent)
:qabstractemmodel(父级)
{
QList根数据;
rootData子级(row);
如果(子项)
返回createIndex(行、列、子项);
其他的
返回QModelIndex();
}
QHash structureDataModel::roleNames()常量
{
QHash角色;
角色[structureRoles::folderName]=“folderName”;
返回角色;
}
QModelIndex structureDataModel::父(常量QModelIndex&index)常量
{
如果(!index.isValid())
返回QModelIndex();
StructureItem*childItem=static_cast(index.internalPointer());
StructureItem*parentItem=childItem->parentItem();
if(parentItem==rootItem)
返回QModelIndex();
返回createIndex(parentItem->row(),0,parentItem);
}
int structureDataModel::行计数(常量QModelIndex&parent)常量
{
StructureItem*父项;
if(parent.column()>0)
返回0;
如果(!parent.isValid())
parentItem=rootItem;
其他的
parentItem=static_cast(parent.internalPointer());
返回parentItem->childCount();
}
int structureDataModel::columnCount(常量QModelIndex&parent)常量
{
if(parent.isValid())
返回static_cast(parent.internalPointer())->columnCount();
其他的
返回rootItem->columnCount();
}
QVariant structureDataModel::data(常量QModelIndex&index,int角色)常量
{
如果(!index.isValid())
返回QVariant();
if(角色!=structureRoles::folderName)
返回QVariant();
StructureItem*item=static_cast(index.internalPointer());
返回项->数据(index.column()).toString();
}
Qt::ItemFlags structureDataModel::flags(常量QModelIndex&index)常量
{
如果(!index.isValid())
返回0;
返回qabstractemmodel::flags(索引);
}
QVariant structureDataModel::headerData(int节,Qt::Orientation,int角色)常量
{
如果(方向==Qt::水平和角色==structureRoles::folderName)
返回根项目->数据(节);
返回QVariant();
}
void structureDataModel::setupModelData(StructureItem*父项)
{
QList数据;
数据子对象(child);
}
StructureItem与TreeItem相同(只是名称不同:) 我制作了自己的setupModelData,这样模型只有一行作为根点。 后来我想有一个可编辑的树状视图,但现在一个工作只读树状视图应该马上工作。 我怀疑它与StupMudio数据有什么关系,或者使C++对于QML可见。 PS:我添加了qmlRegisterType(“cci.screenshotCreator.StructureDataModel”,1,0,“StructureDataModel”);到主文件以注册cpp类

最低限度的测试应用:
(我的pastebin档案的所有文件):)

哦,第一眼就没看到。
QML
中的
ListView
TreeView
的委托组件之间存在差异。 在
TreeView
中,您有
itemdegate
,所有数据都通过
styleData
属性展开

在您的情况下,应如下所示:

itemDelegate: Item
    {
        height: 30
        Rectangle
        {
            id: rectangle
            color: styleData.selected ? "lightgray" : "#ffffff"
            border.width: styleData.selected ? 2 : 1
            border.color: styleData.selected ? "lightblue" : "#ababab"
            anchors.fill: parent
        }

        Text
        {
            id: folderText
            text: styleData.value
            fontSizeMode: Text.Fit
            anchors.fill: parent
            font.pointSize: 12
            verticalAlignment: Text.AlignLeft
        }
    }

您在哪一行获得“unabe将[undefined]分配给QString”?关于“text:dataModel.folderName”?哦,对不起,忘了。是的dataModel.FolderName只需调试数据函数及其返回的内容。QVariant structureDataModel::data(const QModelIndex&index,int role)const{return QStringLiteral(“test”);}数据函数在这两种情况下(ur版本和原始版本)都会返回test,但仍然返回相同的错误消息,并且我的树视图中没有文本。但是我在调试控制台中也得到了一些消息:QMetaProperty::read:无法为属性'QQuickPointerEvent::device'kernel\qmetaobject.cpp:3016和QVariant::save:无法保存类型'QModelIndex'(类型id:42)处理未注册的数据类型'const QQuickPointerDevice*'。kernel\qvariant.cpp:2150,在调试模式期间我尝试查看structureView的属性。您能否发布您的最小、完整且可验证的示例。这样我们就可以编译并重现这个问题了?到垃圾箱或某处。或者直接在你的问题中
#include "structuredatamodel.h"

structureDataModel::structureDataModel(QObject *parent)
    : QAbstractItemModel(parent)
{
    QList<QVariant> rootData;
    rootData << "/";
    rootItem = new StructureItem(rootData);
    setupModelData(rootItem);
}

structureDataModel::~structureDataModel()
{
    delete rootItem;
}

QModelIndex structureDataModel::index(int row, int column, const QModelIndex &parent) const
{
    if(!hasIndex(row, column, parent))
        return QModelIndex();

    StructureItem *parentItem;

    if(!parent.isValid())
        parentItem = rootItem;
    else
        parentItem = static_cast<StructureItem*>(parent.internalPointer());

    StructureItem *childItem = parentItem->child(row);
    if(childItem)
        return createIndex(row, column, childItem);
    else
        return QModelIndex();
}

QHash<int, QByteArray> structureDataModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[structureRoles::folderName] = "folderName";
    return roles;
}

QModelIndex structureDataModel::parent(const QModelIndex &index) const
{
    if(!index.isValid())
        return QModelIndex();

    StructureItem *childItem = static_cast<StructureItem*>(index.internalPointer());
    StructureItem *parentItem = childItem->parentItem();

    if (parentItem == rootItem)
        return QModelIndex();

    return createIndex(parentItem->row(), 0, parentItem);
}

int structureDataModel::rowCount(const QModelIndex &parent) const
{
    StructureItem *parentItem;
    if(parent.column() > 0)
        return 0;

    if(!parent.isValid())
        parentItem = rootItem;
    else
        parentItem = static_cast<StructureItem*>(parent.internalPointer());

    return parentItem->childCount();
}

int structureDataModel::columnCount(const QModelIndex &parent) const
{
    if(parent.isValid())
        return static_cast<StructureItem*>(parent.internalPointer())->columnCount();
    else
        return rootItem->columnCount();
}

QVariant structureDataModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();

    if(role != structureRoles::folderName)
        return QVariant();

    StructureItem *item = static_cast<StructureItem*>(index.internalPointer());


    return item->data(index.column()).toString();
}


Qt::ItemFlags structureDataModel::flags(const QModelIndex &index) const
{
    if(!index.isValid())
        return 0;

    return QAbstractItemModel::flags(index);
}

QVariant structureDataModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Horizontal && role == structureRoles::folderName)
        return rootItem->data(section);

    return QVariant();
}


void structureDataModel::setupModelData(StructureItem *parent)
{
    QList<QVariant> data;
    data << "Test";
    StructureItem *child = new StructureItem(data, parent);
    parent->appendChild(child);
}
itemDelegate: Item
    {
        height: 30
        Rectangle
        {
            id: rectangle
            color: styleData.selected ? "lightgray" : "#ffffff"
            border.width: styleData.selected ? 2 : 1
            border.color: styleData.selected ? "lightblue" : "#ababab"
            anchors.fill: parent
        }

        Text
        {
            id: folderText
            text: styleData.value
            fontSizeMode: Text.Fit
            anchors.fill: parent
            font.pointSize: 12
            verticalAlignment: Text.AlignLeft
        }
    }