LINUX.ORG.RU

Связывание C++ и QML. Продолжение...

 ,


0

3

В общем вернулся я к идеи потыкать QML дальше.

Столкнулся с хитрой такой проблемой:
Имеется класс модели SuperModel: public QAbstractTableModel и класс вьюхи SuperTable основанной на QQuickPaintedItem.

Для обоих типов прописаный Q_PROPERTY(для модели source, для вьюхи model и все в том же духе)

Пишу QML'ку что то в духе

ApplicationWindow {
    width: 800
    height: 600
    visible: true

    SuperModel{
        id: model
    }

    SuperView{
        id: View
        model: model
    }
}

Получаю ошибку в стиле: Cannot assign to non-existent property «model»

Это все из-за типов?

Как то напряжно связывать Qt с C++ в общем или я что-то н понимаю?

★★★★★
Ответ на: комментарий от CrossFire

Ничего не изменилось.

Вот так кстати свойство объявленно:

Q_PROPERTY(QAbstractTableModel* model READ model WRITE setModel)
Может дело в указателе?

deterok ★★★★★
() автор топика
Ответ на: комментарий от panter_dsd

Нет :)

qmlRegisterType<SuperView>("Puper", 1, 0, "SuperView");
qmlRegisterType<SuperModel>("Puper", 1, 0, "SuperModel");

deterok ★★★★★
() автор топика
Последнее исправление: deterok (всего исправлений: 2)
Ответ на: комментарий от CrossFire

Собрал все заново:

./test
QML debugging is enabled. Only use this in a safe environment.
QQmlApplicationEngine failed to load component
qrc:/qml/main.qml:33 Cannot assign to non-existent property "model"

deterok ★★★★★
() автор топика
Ответ на: комментарий от fluorite

Если заменить qmlRegisterType на qRegisterMetaType -> ошибка, что нет такого итема. Если просто добавить, то ничего не меняется.

deterok ★★★★★
() автор топика
Ответ на: комментарий от equeim

Что за нафиг?

Я не хочу так делать. Это дебилизм, т.к. у меня еще есть несколько моделей, по этому QAbstractTableModel использую, а не потому что моей левой пятке захотелось...

Сейчас в общем проверю, но это не решение.

cast CrossFire fluorite

deterok ★★★★★
() автор топика
Ответ на: комментарий от equeim

Не прокатило. И слава ЛММ...

Не хочется верить что они заставляют жертвовать полиморфизмом ради простоты...

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Да, что-то я ступил. Попробуй таким же образом сначала QAbstractTableModel зарегистрировать. Стандартного виджета для этой модели в Qt Quick ведь нет, может ей надо вручную сделать qmlRegisterType

equeim ★★
()
Последнее исправление: equeim (всего исправлений: 1)
Ответ на: комментарий от equeim

Метасистема где-то пытается создать экземпляр абстрактного класса QAbstractTableModel

/usr/include/qt5/QtQml/qqmlprivate.h:102: ошибка: allocating an object of abstract class type 'QQmlElement<QAbstractTableModel>'
    void createInto(void *memory) { new (memory) QQmlElement<T>; }                                        ^

deterok ★★★★★
() автор топика
Ответ на: комментарий от equeim

В общем все это проделал, но проблема не в этом...

deterok ★★★★★
() автор топика

УМВР

main.qml

import QtQuick 2.4
import QtQuick.Controls 1.2
import Puper 1.0

Item {
    width: 800; height: 600

    SuperModel {
        id: model
    }

    SuperView {
        id: view
        anchors.fill: parent
        model: model
    }

    Text {
        anchors.centerIn: parent
        text: view.model.objectName
    }
}

superview.h

#ifndef SUPERVIEW_H
#define SUPERVIEW_H

#include <QQuickPaintedItem>
#include "supermodel.h"

class SuperView : public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(SuperModel* model READ model WRITE setModel NOTIFY modelChanged)
public:
    SuperModel* model() const;
public slots:
    void setModel(SuperModel* arg);
signals:
    void modelChanged(SuperModel* arg);
protected:
    void paint(QPainter *p) override;
private:
    SuperModel* m_model;
};

#endif // SUPERVIEW_H

superview.cpp

#include "superview.h"

#include <QPainter>
#include <QDebug>

SuperModel *SuperView::model() const
{
    return m_model;
}

void SuperView::setModel(SuperModel *arg)
{
    if (m_model == arg)
        return;

    m_model = arg;
    emit modelChanged(arg);
}

void SuperView::paint(QPainter *p)
{
    p->fillRect(boundingRect(), Qt::green);
}

supermodel.h

#ifndef SUPERMODEL_H
#define SUPERMODEL_H

#include <QAbstractTableModel>

class SuperModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    SuperModel();
protected:
    int rowCount(const QModelIndex &parent) const override;
    int columnCount(const QModelIndex &parent) const override;
    QVariant data(const QModelIndex &index, int role) const override;
};

#endif // SUPERMODEL_H

supermodel.cpp

#include "supermodel.h"

SuperModel::SuperModel()
{
    setObjectName("SuperModel");
}

int SuperModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 0;
}

int SuperModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 0;
}

QVariant SuperModel::data(const QModelIndex &index, int role) const
{
    Q_UNUSED(index);
    Q_UNUSED(role);
    return QVariant();
}

main.cpp
#include <QGuiApplication>
#include <QQuickView>

#include <qqml.h>

#include "supermodel.h"
#include "superview.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<SuperModel>("Puper", 1, 0, "SuperModel");
    qmlRegisterType<SuperView>("Puper", 1, 0, "SuperView");

    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    return app.exec();
}


fluorite ★★★★★
()
Ответ на: комментарий от fluorite

Киньте в меня тысячью тухлых карпусколов.

Все готовы??.

Я забыл Q_OBJECT...

deterok ★★★★★
() автор топика
Ответ на: комментарий от fluorite

Если меняю на предка - «QAbstractTableModel»?, то запускается вот с этим:

qrc:/qml/main.qml:41:16: Unable to assign ImageModel to [unknown property type

deterok ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.