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
Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь МаксимовOct. 5, 2024, 5:51 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Now discuss on the forum
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey1Nov. 15, 2024, 5:04 p.m.
NSProjectJune 4, 2022, 1:49 p.m.
IscanderCheNov. 1, 2024, 1:43 a.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
Вообще, такую модель данных как у вас лучше было бы выделить в отдельный класс модели, и также регистрировать в контексте 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:
Работает! Ура! Спасибо!.