LINUX.ORG.RU

Класс использовать в QML

 ,


0

1

Есть у меня модель https://github.com/neochapay/radon/blob/master/src/model/track.cpp https://github.com/neochapay/radon/blob/master/src/model/track.h

Которая загружает инфу о треках и типа должна делать с ними все манипуляции. Есть так же диалог на QML https://github.com/neochapay/radon/blob/master/pages/Dialogs/EditTrackDialog.qml

который типа должон всю эту информацию предоставлять и изменять, НО - суть проблемы: Если я делаю в QML так - что явно не верно...

var track = trackModel.toId(track_id);
У меня естественно вываливается qrc:/pages/Dialogs/EditTrackDialog.qml:16: Error: Unknown method return type: Track*

Как быть правильно?

★★★

Нужен минимальный неработающий пример, лучше с .pro в архиве, иначе из объяснения не очень понятно в чем вообще проблема и что нужно сделать. Тут можно посмотреть как примерно такая же задача решается у нас.

Если кратко, то для работы с плюсовыми объектами из QML удобно использовать Q_PROPERTY.

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

вернуть QObject * вместо Track *

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

Q_PROPERTY как я понял применяется если там переменные меняются а если мне надо получить их?
Тоесть я по id трека в базе хочу знать его исполнителя и название

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

QML удобно использовать Q_PROPERTY.

Да, кста. Правильно. Чтоб QML все методы/свойства объекта видел нужны Q_PROPERTY и Q_INVOKABLE, иначе будет говорить что «неизвестный метод» или как-то так.

ossa ★★
()

Я не очень знаком с QML, но, насколько я понимаю, не хватает вызова

qmlRegisterType<Track>()

В правильном месте. Вот здесь подробности: http://stackoverflow.com/a/22293198/2935339

asaw ★★★★★
()
Ответ на: комментарий от chapay
Q_INVOKABLE static QObject* toId(int trackId);

Я правда ни разу на статические методы такого не делал, а посему не знаю будет работать или нет.

Ну и этот Track должен быть по всем правилам описан с Q_INVOKABLE и Q_PROPERTY

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

Q_PROPERTY как я понял применяется если там переменные меняются а если мне надо получить их?

Вот есть класс звуковой дорожки. Мы берем, и все поля оформляем как свойства (Q_PROPERTY).

Для примера возьмем название:

Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)
Потом поставим текстовый курсор на название макроса, нажмем Alt+Enter и сгенерируем недостающие члены класса. В итоге будут созданы геттер, сеттер, приватное поле и сигнал на изменение. Если нам нужно только читать, можно оставить только имя геттера после READ:
Q_PROPERTY(QString title READ title CONSTANT)
Я бы не советовал на каждый чих обращаться к базе, мы вот используем модель-синглтон заполняющую при запуске список чего-нибудь (например задач) и отдающую его через QQmlListProperty, которую можно использовать непосредственно для отображения списка.

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

Так я и хочу взять один раз класс Track и уже с ним работать сделав один запрос к БД или я опять не прав?

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

Так я и хочу взять один раз класс Track и уже с ним работать сделав один запрос к БД или я опять не прав?

Такой подход работает только до того как появится необходимость работать с расшивками.

И потом как я через Q_PROPERTY вызову данные мне нужного трека?

Ну а без них разве что прописывать геттеры руками (те, что прописаны сейчас просто пабликом будут не видны).

В общем я бы предложил попробовать грохнуть из хеадера предпоследние две строки и в main.cpp прописать нечто вроде:

    qmlRegisterType<Track>("ru.test.player", 1, 0, "Track");
А в QML import ru.test.player 1.0

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

Вот пример Тут вызов begin возвращает объект-итератор (код вызова тут). Сам объект итератор описан тут

Он нигде не регистрируется, он просто описан по правилам и QML в курсе про его методы и свойства.

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

окей, теперь оно материться так
qrc:/pages/Dialogs/EditTrackDialog.qml:18: TypeError: Property 'toId' of object [object Object] is not a function

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

Перенёс туда getTitle()
qrc:/pages/Dialogs/EditTrackDialog.qml:18: TypeError: Property 'getTitle' of object [object Object] is not a function
JackTemporaryException : now quits...

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

Программка крешится, причём достаточно забавно :)
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
«SELECT name FROM arists WHERE id=:id» " Количество параметров не совпадает"

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

Так, с этим разобрались. Имя базы данных с опечаткой было...
теперь крешимся с Name is not original

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

Всё. Этот вопрос пока закрыт...буду дебажить :)

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