alex_lipAug. 17, 2017, 5:55 a.m.
Я только учусь..(как правильно присвоить значение объекту другого класса)
Есть класс
#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!
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
AD
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
m
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
m
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Last comments
How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
EVILEG-CORE. Using Google reCAPTCHA 2001; 98 29 34 priligy buy
PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots) priligy 30mg Am J Obstet Gynecol 171 1488 505
Django - Tutorial 003. Model, Template, View on Django Hair follicles are believed to produce approximately 20 individual hair shafts over the life of the follicle as the follicle progresses through cycles of hair production, shedding ejection, invo…
Now discuss on the forum
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
Всё ещё разбираюсь с кешем. 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
IscanderCheNov. 1, 2024, 1:43 a.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь МаксимовOct. 3, 2024, 2:05 p.m.
Вообще, такую модель данных как у вас лучше было бы выделить в отдельный класс модели, и также регистрировать в контексте 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:
Работает! Ура! Спасибо!.