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
Последние комментарии
Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
Сейчас обсуждают на форуме
добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
IscanderChe31 октября 2024 г. 15:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3 октября 2024 г. 4:05
Вообще, такую модель данных как у вас лучше было бы выделить в отдельный класс модели, и также регистрировать в контексте 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:
Работает! Ура! Спасибо!.