qmlRegisterType в основном ведет себя странно - PullRequest
0 голосов
/ 26 июня 2018

Я реализовал модель в 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 голосов
/ 26 июня 2018

Ошибка действительно проста, метод data() в QAbstractListModel, поэтому, если вы используете данные внутри MyModel, это интерпретирует, что вы хотите использовать этот метод, а не данные, которые вы действительно хотите передать, решение состоит в том,изменить имя:

*. cpp

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

*. qml

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

Plus:

  • С другой стороны, у вас есть другая ошибка, метод элементов данных должен возвращать меню:

    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: "-"
                }
            }
        }
    }
    

Я сделал другие улучшения в вашем коде, чтобы вы могли найти полный код в следующем ссылка .

...