主要行为中的qmlRegisterType异常

时间:2018-06-26 03:17:06

标签: c++ qt qml qt5 qabstractitemmodel

我用c ++实现了一个模型,想分配给Qml,但错误消息显示:

  

无法将函数分配给var以外的任何类型的属性。

我的代码可能是什么问题,谢谢!

.qml

ListView{
        anchors.fill: parent
        model:MyModel{
            list:data
        }
        delegate: objRecursiveDelegate
    }

main.cpp

qmlRegisterType<MyModel>("Model",1,0,"MyModel");
qmlRegisterUncreatableType<Data>("Model",1,0,"Data",QStringLiteral("Data should not be created in QML"));

Data data;
engine.rootContext()->setContextProperty(QStringLiteral("data"), &data);
  

MyModel.h(尝试使用QAbstractListModel进行定义)

class Data;
class MyModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(Data *list READ list WRITE setList)

    public:
        Data *list() const;
        void setList(Data *list);
    private:
        Data* mList;
 }
  

MyModel.cpp

Data *MyModel::list() const
{
    return mList;
}
 void MyModel::setList(Data *list)
{
    beginResetModel();
    if (mList)
        mList->disconnect(this);
    mList = list;
    /..../
    endResetModel();
}
  

data.h

class Data:public QObject
{
    Q_OBJECT
public:
    explicit Data(QObject *parent = nullptr);
 /..../
private:
    QVector<unit> menu;
};

1 个答案:

答案 0 :(得分:1)

错误非常简单,这是QAbstractListModel的data()方法,因此,如果您在MyModel中使用数据,则说明您要使用此方法,而不是您真正想要传递的数据。 ,解决方法是更改​​名称:

*。cpp

Data data;
engine.rootContext()->setContextProperty(QStringLiteral("info"), &data);

*。qml

ListView{
    anchors.fill: parent
    model:MyModel{
        list: info
    }
    delegate: objRecursiveDelegate
}

加:

  • 另一方面,您还有另一个错误,数据项方法必须返回菜单:

    QVector<unit> Data::items() const{
        return menu;
    }
    
  • 另一方面,在您的委托中,您必须使用以下名称来访问对每个角色的访问权限:

    Component {
        id: objRecursiveDelegate
        Column {
            Row {
                //indent
                Item {
                    height: 1
                    width: level * 40 // <--
                }
                Text {
                    text: name // <--
                }
                Button{
                    x:550
                    width:30
                    text: "-"
                }
            }
        }
    }
    

我们对您的代码进行了其他改进,因此您可以在下面的link中找到完整的代码。