alex_lip17 августа 2017 г. 5:55
Я только учусь..(как правильно присвоить значение объекту другого класса)
Есть класс
#ifndef DATAOBJECT_H #define DATAOBJECT_H #include <QObject> //![0] class DataObject : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QStringcolor READ color WRITE setColor NOTIFY colorChanged) //![0] public: DataObject(QObject *parent=0); DataObject(const QString &name, const QString &color, QObject *parent=0); QString name() const; void setName(const QString &name); QString color() const; void setColor(const QString &color); signals: void nameChanged(); void colorChanged(); private: QString m_name QString m_color; //![1] }; //![1]В main я присваиваю значение datalist
#include <QDebug> #include "dataobject.h" DataObject::DataObject(QObject *parent) : QObject(parent) { } DataObject::DataObject(const QString &name, const QString &color, QObject *parent) : QObject(parent), m_name(name), m_color(color) { } QString DataObject::name() const { return m_name; } void DataObject::setName(const QString &name) { if (name != m_name) { m_name = name; emit nameChanged(); } } QString DataObject::color() const { return m_color; } void DataObject::setColor(const QString &color) { if (color != m_color) { m_color = color; emit colorChanged(); } }
int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QList<QObject*> dataList; dataList.append(new DataObject("Item 1", "red")); dataList.append(new DataObject("Item 2", "green")); dataList.append(new DataObject("Item 3", "blue")); dataList.append(new DataObject("Item 4", "yellow")); QQmlApplicationEngine engine; AppCore appCore; QQmlContext *context=engine.rootContext(); context->setContextProperty("appCore", &appCore); context->setContextProperty("myModel", QVariant::fromValue(dataList)); engine.load(QUrl(QLatin1String("qrc:/main.qml"))); return app.exec(); }
Есть еще один класс в котором я хотел бы переприсвоить значения datalist
void AppCore::onResult(QNetworkReply *reply) { if(!reply->error()){ QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); QJsonObject root = document.object(); int x,y; x=3; y=root.value("count").toInt(); QStringList lst; QString st1, st2, st3, st_all; st_all=""; QJsonValue jv = root.value("items"); if(jv.isArray()){ QJsonArray ja = jv.toArray(); for(int i = 0; i < ja.count(); i++){ QJsonObject subtree = ja.at(i).toObject(); st1 = QString::number(subtree.value("id").toInt()); st2 = subtree.value("name").toString(); st3 = "Test"; st_all = st_all+ st1+"|"+st2+"|"+st3+"\n"; } } // QList<QObject*> dataList; // dataList.append(new DataObject("Item 1", "red")); // dataList.append(new DataObject("Item 2", "green")); // dataList.append(new DataObject("Item 3", "blue")); // dataList.append(new DataObject("Item 4", "yellow")); emit sendToQmlString(st_all); emit sendToQmlRowCount(QString::number(root.value("count").toInt())); } reply->deleteLater(); }
Как правильно это сделать(всю жизнь писал на фоксе трудно вхожу в тему). Глобальные переменные в QT не приветствуются. Сигнал и слот? По ссылке ? Напишите правильный пример please!
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD
- Akiv Doros
- 11 ноября 2024 г. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
m
- molni99
- 26 октября 2024 г. 1:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
m
- molni99
- 26 октября 2024 г. 1:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Последние комментарии
ИМ
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 ноября 2024 г. 11:51
Evgenii Legotckoi31 октября 2024 г. 14:37
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5 октября 2024 г. 7:51
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi24 июня 2024 г. 15:11
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey115 ноября 2024 г. 6:04
NSProject4 июня 2022 г. 3:49
IscanderChe31 октября 2024 г. 15:43
Вообще, такую модель данных как у вас лучше было бы выделить в отдельный класс модели, и также регистрировать в контексте QML, как вы это делаете. И обновлять эту модель в C++, кидая в QML сигнал лишь о том, что модель обновилась, если там вообще это понадобится. Уже от реализации зависеть будет.
Да бог с ней с моделью. Я пока простых вещей не понимаю. Поэтому для начала хочу просто поменять datalist в другом классе и "дернуть" заново через
саму модель. Пример с animal я видел. Пока не дорос. В процессе ))
Еще раз - как мне в методе класса AppCore::onResult изменить данные dataList и вернуть их в main ?
На минуточку. QML поддерживает только простую конверсию типов для QList. Можете почитать на этой странице .
Спасибо за ответ. Буду мурыжить пример с моделью Animal. Кстати на хабре обалденная статья про MVC в QT.
https://habrahabr.ru/post/302428/ (что-то ссылка не вставляется через кнопку)
Ну а все-таки - абстрагируясь от QML(без него). Как правильно в QT в методе одного класса изменить данные объекта, объявленного в другом классе.
В Qt MVC в чистом виде нет, поскольку View и Controller объединены в один View.
А что вы думаете про директиву friend ?
Стараюсь не использовать. В моём понимании - это несколько нарушает принципы ООП, когда внешний класс получает доступ к приватным полям другого класса как-то иначе, чем через специальные get и set методы.
Использовал пример с моделью Animal. Просто подключил к проекту два файла из примера : model.cpp и model.h
А в методе класса AppCore::onResultв main все работает
Проглатывает(ошибок нет), но ничего не отображается. Хотя в методе addAnimal прописана обертка Видимо надо еще какой-то сигнал передать, чтобы изменения модели отобразились в слое QML?
В примере на хабре есть магические символы
Что бы они значили?
Этими магическими символами автор информирует представление на QML о том, что данные были изменены.
В случае с SQL моделями обновление происходит автоматически (я работал в основном с SQL моделями), а в случае обычной модели, наследованной от QAbstractListModel очевидно нужно вручную кидать сигнал. Сигнал dataChanged() , который использует автор той статьи уже присутсвует в модели QAbsctractListModel , поэтому его объявлять не нужно. Можно просто использовать его.
Не прокатило (((
На всякий случай прикреплю весь проект (он маленький). Может быть будет возможность посмотреть?
Там в AppCore::onResult после JSON парсинга пытаюсь изменить модель.
ну... вечерком завтра скорее всего отвечу, как посмотрю проект.
Гранд мерси!
хм. Похоже файл где-то в кэше остался. Я его второй раз не прикреплял.
Вы создаёте новую модель Animal в методе onResult() в AppCore, вместо этого в функции main необходимо в объект класса AppCore передать ссылку или указатель на объект модели Animal. То есть нужно объявить переменную типа Animal в объявлении класса AppCore. И уже этого объекта вызывать метод addAnimal()
Например, в AppCore определить метод setAnimalModel() (я удалил в этом коде всё, что не касается необходимых изменений)
Спасибо большое за терпение. В понедельник попробую.
Доброе утро.
Ругается
В принципе правильно - ведь AnimalModel у нас описана в файлк model.h . Этот файл нужно как-то инклудить к appcore.h ?
В appcore.h нужно написать инклюд.
Также можете попытаться сделать Forward Declaration, то есть указать в заголовочнике appcore.h перед классом AppCore класс AnimalModel без объявления.
Добавил #include "model.h " в appcore.h ругается
У вас там случаем нет повторяющихся объявлений этого класса в нескольких заголовочниках?
Как бы ошибка очевидно говорит о переобъявлении класса.
По второму варианту ( Forward Declaration)
Не. ну тут у Вас в самом файле main.cpp видимо удалена модель. Удалили её из main функции??
По второму варианту все получилось. просто надо было в начало main добавить AnimalModel model; Модель то боъявить надо )))
СПАСИБО!
А как теперь очистить данные модели?
Насколько я понял надо добавить метод Animal.Clear , где прописать что-то между зарезервированными функциями beginResetModel() и endResetModel() . А вот что прописать? Есть какая-то функция полной очистки? или нужно как-то все объекты перебрать и дестроить их по очереди?
Да, там нужно будет создать метод, например clear() и дестроить их поочерёдно, скорее всего в цикле. Там же создаются объекты с выделением памяти в куче у вас. А память нужно очищать.
Сделал вот так - ошибок нет, но ничего не удаляется
Попробовал вот так - все удаляет, но потом ничего не добавляет
А вы реализовывали метод removeRows() ?
Проект тогда прикрепите, вечером после работы гляну.
По кнопке найти при пустом поле выводит 3 записи, а если в поле ввести 11 - выводит одну запись.
Я сделал внешние ip адреса - по идее вы должны json получить и разобрать.
Кстати еще вопрос - а как понять, что ip адрес не доступен и сообщение вывалить в этой конструкции?
Я так сразу и не вспомню.
Почитайте вот эту статью , я разобрал в ней свои мысли об ошибках QNetworkAccessManager.
ок. Почитаю по этому поводу. ...
Попробовал так - тоже не работает. Пока сдаюсь. А есть статьи описывающие работу с отладчиком ?
Неа. Таких статей нет. Тут скорее видео нужно делать, но у меня этого нет в приоритете.
Вот так почти работает. Если одна строчка - даже правильно. А если в модели несколько строчек - удаляет не все...
Бред. Если я два раза пишу.
То чистит нормально. Видимо я не понимаю как реализованы индексы....Тут скорее с конца надо удалять в самой модели. Что-то вроде такого должно быть.
А вот с beginRemoveRows и endRemoveRows немного другая ситуация. Они просто показывают с какой строки по какую вы собираетесь сделать удаление.
Фактически в beginRemoveRows для полной очистки нужно указать индекс первой строки и индекс последней строки.
То есть в результате должно получиться нечто такое.
Спасибо!
Наверное вот так все-таки правильнее
Да. Согласен. Так будет правильнее.
А еще не подскажете (это все про модель-вью) вот в этом примере есть интересная реализация CoverFlow (4)
У меня при компиляции выходит qrc:/main.qml:106 : ReferenceError: itemSize is not definedhttps://habrahabr.ru/post/190090/
Там в QML слое вводятся переменный
Куда смотреть? Как их объявить? Это из-за QtQuick 2.7 ?
вот код
Может быть не видит itemSize.
Попробуйте добавить id для того Rectangle, где есть это property itemSize:
Работает! Ура! Спасибо!.