alex_lip17. August 2017 05: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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
sf
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
МВ
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
ЛС
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Letzte Kommentare
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5. Oktober 2024 07:51
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5. Februar 2024 01:50
Jetzt im Forum diskutieren
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3. Oktober 2024 04:05
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
Кирилл Гусарев27. September 2024 09:09
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
Вообще, такую модель данных как у вас лучше было бы выделить в отдельный класс модели, и также регистрировать в контексте 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:
Работает! Ура! Спасибо!.