alex_lip
alex_lipТам. 17, 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]

#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(); } }
В  main я присваиваю значение datalist

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
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

40
Evgenii Legotckoi
  • Там. 17, 2017, 6:10 Т.Ж.

Вообще, такую модель данных как у вас лучше было бы выделить в отдельный класс модели, и также регистрировать в контексте QML, как вы это делаете. И обновлять эту модель в C++, кидая в QML сигнал лишь о том, что модель обновилась, если там вообще это понадобится. Уже от реализации зависеть будет.


Передавать данные также можно и через сигнал слот, но лучше делать модель данных. В самой документации Qt посмотрите пример создания модели для начала.. Пример есть на этой странице , посмотрите в сторону AnimalModel.
    alex_lip
    • Там. 17, 2017, 7:15 Т.Ж.

    Да бог с ней с моделью. Я пока простых вещей не понимаю. Поэтому для начала хочу просто поменять datalist в другом классе и  "дернуть" заново через

      context->setContextProperty("myModel", QVariant::fromValue(dataList));

    саму модель.   Пример с animal я видел. Пока не дорос. В процессе ))
    Еще раз - как мне в методе класса AppCore::onResult изменить данные dataList  и вернуть их в main ?
      Evgenii Legotckoi
      • Там. 17, 2017, 7:58 Т.Ж.
      • (өңделген)

      На минуточку. QML поддерживает только простую конверсию типов для QList. Можете почитать на этой странице .

      А у Вас в dataList висит кастомный объект DataObject. То есть модфицировать его в C++ части, а потом заменить всю модель кинув её через сигнал-слотовое соединение уже не получится. Как минимум нужно делать регистрацию типов через qmlRegisterMetaType со всеми выходящими проблемами, поскольку QList всё равно придётся декларировать как модель и делать соответствующую модель данных, чтобы гонять такие данные, но это накладно по ресурсам. Это не указатель на объект кинуть. Там и копирование будет производиться.
       
      А теперь идём дальше. Если так хочется достучать до модели из контекста, то для этого есть метод contextProperty() у QQMlContext. Передаёте туда то имя, которым обозначили переменную в контексте и получаетe QVariant, из которого нужно будет забрать переменную через метод toList() , а из него уже забирать данные и модифицировать их. Но это подход через Ж. в данном контексте. Я таким не занимаюсь ))) В данной задаче правильно делать через модель данных, поэтому я не согласен с вашим нежеланием учиться что-то делать сразу правильно, мотивируя это своим профессиональным уровнем.
       
      Ещё вариант, объявить переменную QList<DataObject *> в самом AppCore, тогда можно будет его просто модифицировать. Нужен будет только getter метод, чтобы вернуть ссылку на этот объект и зарегистрировать его в контексте QML.  Это ещё куда ни шло, получше первого варианта с contextProperty() . Модифицикация объектов будет как с обычным QList , список методов для получения и добавления элементов смотрите в официальной документации. Также Вы забываете, что при удалении элементов DataObject необходимо освобождать память, чтобы не было утчечек памяти. Но это будет уже по сути реализация работы с моделью данных. Так что опять же возвращаемся к той модели AnimalModel.
       
      Поэтому я и рекомендовал Вам сначала разобраться с моделью данных, а потом всё станет очень просто. Особенно, если учесть, что это одна из основ работы Qt фреймворка. Так что взвесьте ещё раз все за и против.
        alex_lip
        • Там. 17, 2017, 8:43 Т.Ж.
        • (өңделген)

        Спасибо за ответ. Буду мурыжить пример с моделью Animal. Кстати на хабре обалденная статья про MVC в QT.
        https://habrahabr.ru/post/302428/   (что-то ссылка не вставляется через кнопку)

        Ну а все-таки - абстрагируясь от QML(без него). Как правильно в QT в методе одного класса изменить данные объекта, объявленного в другом классе.

          Evgenii Legotckoi
          • Там. 17, 2017, 9 Т.Ж.

          В Qt MVC в чистом виде нет, поскольку View и Controller объединены в один View.

          Да, хорошая статья, особенно если учесть то, что там есть момент с регистрацией типов в qml без регистрации объекта в контексте. В своё время я пропустил тот момент. У меня подобная статья есть для QSqlQueryModel .

          Вообще, по возможности, данные которые можно представить таблицей, следует представлять в виде модели данных.

          Что касается изменения данных класса, который объявлен в другом классе, то будет лучше предустмотреть некий метод, который будет изменять данные этого класса. Поскольку это будет правильнее с точки зрения ООП.
          class A 
          {
          public:
              void increnentInt()
              {
                  ++m_someInt;
              }
          private:
              int m_someInt;  
          }
          Ну в другом классе нужно иметь либо ссылку, либо указатель на тот объект, который вы собираетесь изменять. Причём не особенно важно, как вы получили эту ссылку или указатель (это зависит от логики приложения и алгоритма кода). И имея этот указатель или ссылку уже вызвать метод, которым вы будете изменять содержимое объекта другого класса.
            alex_lip
            • Там. 17, 2017, 9:11 Т.Ж.

            А что вы думаете про директиву friend ?

            class A {
                friend void B::changeValue();
            
                private:
                    int _value;
            };
            
            class B {
                void changeValue() 
                {
                    a->_value = 2;
                }
            
                private:
                    A *a;
            };
              Evgenii Legotckoi
              • Там. 18, 2017, 1:37 Т.Ж.

              Стараюсь не использовать. В моём понимании - это несколько нарушает принципы ООП, когда внешний класс получает доступ к приватным полям другого класса как-то иначе, чем через специальные get и set методы.

                alex_lip
                • Там. 18, 2017, 2:19 Т.Ж.
                • (өңделген)

                Использовал пример с моделью Animal. Просто подключил к проекту два файла из примера : model.cpp и model.h

                в main все работает
                 

                  AnimalModel model;
                    model.addAnimal(Animal("Wolf", "Medium"));
                    model.addAnimal(Animal("Polar bear", "Large"));
                    model.addAnimal(Animal("Quoll", "Small"));
                context->setContextProperty("myModel", &model);
                А в методе класса AppCore::onResult
                 AnimalModel model;
                model.addAnimal(Animal("Wolfenstein", "Medium"));

                Проглатывает(ошибок нет), но ничего не отображается. Хотя в методе addAnimal прописана обертка
                void AnimalModel::addAnimal(const Animal &animal)
                {
                    beginInsertRows(QModelIndex(), rowCount(), rowCount());
                    m_animals << animal;
                    endInsertRows();
                }
                Видимо надо еще какой-то сигнал передать, чтобы изменения модели отобразились в слое QML?

                В примере на хабре есть магические символы
                 
                     m_data[0] = QString("Size: %1").arg(m_data.size());
                    QModelIndex index = createIndex(0, 0, static_cast<void *>(0));
                    emit dataChanged(index, index);
                Что бы они значили?
                  Evgenii Legotckoi
                  • Там. 18, 2017, 2:47 Т.Ж.
                  • (өңделген)

                  Этими магическими символами автор информирует представление на QML о том, что данные были изменены.
                  В случае с SQL моделями обновление происходит автоматически (я работал в основном с SQL моделями), а в случае обычной модели, наследованной от QAbstractListModel очевидно нужно вручную кидать сигнал. Сигнал dataChanged() , который использует автор той статьи уже присутсвует в модели QAbsctractListModel , поэтому его объявлять не нужно. Можно просто использовать его.


                  Я не заметил коннекта этого сигнала к чему либо в QML коде, поэтому полагаю, что подключение происходит автоматически, поскольку класс наследован от QAbsctratListModel , также как и класс AnimalModel . Поэтому в методе addAnimal должно быть достаточно выкинуть этот сигнал.
                  void AnimalModel::addAnimal(const Animal &animal)
                  {
                      beginInsertRows(QModelIndex(), rowCount(), rowCount());
                      m_animals << animal;
                      endInsertRows();
                  
                      QModelIndex index = createIndex(0, 0, static_cast<void *>(0));
                      emit dataChanged(index, index);
                  }
                    alex_lip
                    • Там. 18, 2017, 3:25 Т.Ж.

                    Не прокатило (((
                    На всякий случай прикреплю весь проект (он маленький). Может быть будет возможность посмотреть?
                    Там в AppCore::onResult после JSON парсинга пытаюсь изменить модель.

                      Evgenii Legotckoi
                      • Там. 18, 2017, 3:29 Т.Ж.

                      ну... вечерком завтра скорее всего отвечу, как посмотрю проект.

                        alex_lip
                        • Там. 18, 2017, 3:49 Т.Ж.

                        Гранд мерси!

                          alex_lip
                          • Там. 18, 2017, 3:50 Т.Ж.

                          хм. Похоже файл где-то в кэше остался. Я его второй раз  не прикреплял.

                            Evgenii Legotckoi
                            • Там. 19, 2017, 10:14 Т.Ж.
                            • Жауап шешім ретінде белгіленді.

                            Вы создаёте новую модель Animal в методе onResult() в AppCore, вместо этого в функции main необходимо в объект класса AppCore передать ссылку или указатель на объект модели Animal. То есть нужно объявить переменную типа Animal в объявлении класса AppCore. И уже этого объекта вызывать метод addAnimal()

                            Например, в AppCore определить метод setAnimalModel() (я удалил в этом коде всё, что не касается необходимых изменений)

                            class AppCore : public QObject
                            {
                                Q_OBJECT
                            
                             public:
                                void setAnimalModel(AnimalModel *animalModel);
                            
                            private:
                                AnimalModel* m_model;
                            };
                            А в файле исходного кода это будет выглядеть так
                            void AppCore::setAnimalModel(AnimalModel *animalModel)
                            {
                                m_model = animalModel;
                            }
                            
                            void AppCore::someFunction()
                            {
                                m_model->addAnimal(Animal("Wolfenstein", "Medium"));
                            }
                            В main.cpp это будет так:
                            AppCore appCore;
                            appCore.setAnimalModel(&model);
                            А в метод addAnimal() как оказалось не нужно добавлять сигнал. И так всё работает.
                            void AnimalModel::addAnimal(const Animal &animal)
                            {
                                beginInsertRows(QModelIndex(), rowCount(), rowCount());
                                m_animals << animal;
                                endInsertRows(); 
                            }
                              alex_lip
                              • Там. 19, 2017, 10:31 Т.Ж.

                              Спасибо большое за терпение. В понедельник попробую.

                                alex_lip
                                • Там. 21, 2017, 2:36 Т.Ж.

                                Доброе утро.
                                Ругается

                                C:\Qt\my_work\QuickEsd\appcore.h:20: ошибка: 'AnimalModel' has not been declared
                                     void setAnimalModel(AnimalModel *animalModel);
                                                         ^

                                В принципе правильно - ведь  AnimalModel у нас описана в файлк model.h . Этот файл нужно как-то инклудить к appcore.h ?
                                  Evgenii Legotckoi
                                  • Там. 21, 2017, 2:44 Т.Ж.

                                  В appcore.h нужно написать инклюд.

                                  #include "model.h"
                                  Если файлы находятся в одном каталоге, либо с указанием пути к этом файлу.
                                  Также можете попытаться сделать Forward Declaration, то есть указать в заголовочнике appcore.h перед классом AppCore класс AnimalModel без объявления.
                                  class AnimalModel;
                                  
                                  class AppCore : public QObject
                                  {
                                      // Чего-то там в нём
                                  }
                                  А потом уже подключить инклюд
                                  #include "model.h"
                                  В файле исходных кодов AppCore , то есть в appcore.cpp. Forward Declaration полезно в том плане, что снижает нагрузку на парсинг заголовочников, что немного ускоряет сборку приложения в общем случае.
                                    alex_lip
                                    • Там. 21, 2017, 2:50 Т.Ж.
                                    • (өңделген)

                                    Добавил #include "model.h " в appcore.h  ругается

                                    C:\Qt\my_work\QuickEsd\model.h:44: ошибка: redefinition of 'class Animal'
                                     class Animal
                                           ^


                                      Evgenii Legotckoi
                                      • Там. 21, 2017, 2:52 Т.Ж.

                                      У вас там случаем нет повторяющихся объявлений этого класса в нескольких заголовочниках?
                                      Как бы ошибка очевидно говорит о переобъявлении класса.

                                        alex_lip
                                        • Там. 21, 2017, 2:54 Т.Ж.

                                        По второму варианту ( Forward Declaration)

                                        C:\Qt\my_work\QuickEsd\main.cpp:22: ошибка: 'model' was not declared in this scope
                                             appCore.setAnimalModel(&model);
                                                                     ^


                                          Evgenii Legotckoi
                                          • Там. 21, 2017, 2:56 Т.Ж.

                                          Не. ну тут у Вас в самом файле main.cpp видимо удалена модель. Удалили её из main функции??

                                            alex_lip
                                            • Там. 21, 2017, 2:57 Т.Ж.

                                            По второму варианту все получилось. просто надо было в начало main добавить     AnimalModel model; Модель то боъявить надо  )))

                                            СПАСИБО!

                                              alex_lip
                                              • Там. 21, 2017, 4:43 Т.Ж.

                                              А как теперь очистить данные модели?
                                              Насколько я понял надо добавить метод Animal.Clear , где прописать что-то между  зарезервированными функциями beginResetModel() и endResetModel() . А вот что прописать? Есть какая-то функция полной очистки? или нужно как-то все объекты перебрать и дестроить их по очереди?

                                                Evgenii Legotckoi
                                                • Там. 21, 2017, 4:57 Т.Ж.

                                                Да, там нужно будет создать метод, например clear() и дестроить их поочерёдно, скорее всего в цикле. Там же создаются объекты с выделением памяти в куче у вас. А память нужно очищать.

                                                void clear()
                                                {
                                                   this->beginResetModel();
                                                   // Удалить все объекты здесь
                                                   this->endResetModel();
                                                }
                                                Удалять объекты нужно будет с удалением строки и опретором delete
                                                  alex_lip
                                                  • Там. 23, 2017, 4:22 Т.Ж.

                                                  Сделал вот так - ошибок нет, но ничего не удаляется
                                                   

                                                    void AnimalModel::clearAnimal()
                                                  {
                                                      this->beginResetModel();
                                                      this->beginRemoveRows(QModelIndex(),0,rowCount());
                                                      int count = this->rowCount();
                                                      for (int i = 0; i < count; ++i)
                                                      this->removeRow(i);
                                                  
                                                      this->endRemoveRows();
                                                      this->endResetModel();
                                                  
                                                  }
                                                    alex_lip
                                                    • Там. 24, 2017, 2:09 Т.Ж.

                                                    Попробовал вот так  - все удаляет, но потом ничего не добавляет
                                                     

                                                    void AnimalModel::clearAnimal()
                                                    {
                                                    //    this->beginResetModel();
                                                    
                                                        beginRemoveRows(QModelIndex(),0,rowCount()-1);
                                                        int count = this->rowCount();
                                                        for (int i = 0; i < count; ++i)
                                                        removeRow(i);
                                                        endRemoveRows();
                                                    
                                                     //   this->endResetModel();
                                                    
                                                    }
                                                      Evgenii Legotckoi
                                                      • Там. 24, 2017, 2:11 Т.Ж.

                                                      А вы реализовывали метод removeRows() ?

                                                      Я вот не помню, нужно ли его переопределять или как. По идее нужно сделать правильное удаление элементов из модели с очисткой памяти.
                                                        Evgenii Legotckoi
                                                        • Там. 24, 2017, 2:13 Т.Ж.

                                                        Проект тогда прикрепите, вечером после работы гляну.

                                                          alex_lip
                                                          • Там. 24, 2017, 4:29 Т.Ж.
                                                          • (өңделген)

                                                          По кнопке найти при пустом поле выводит 3 записи, а если в поле ввести 11 - выводит одну запись.

                                                          Я сделал внешние ip адреса - по идее вы должны json получить и разобрать.
                                                          Кстати еще вопрос - а как понять, что ip адрес не доступен и сообщение вывалить в этой конструкции?

                                                           QNetworkReply *replay =  networkManager->get(QNetworkRequest(QUrl(url)));
                                                          
                                                          //    // Connect networkManager response to the handler
                                                              connect(networkManager, &QNetworkAccessManager::finished, this, &AppCore::onResult);
                                                          
                                                          //    // We get the data, namely JSON file from a site on a particular url
                                                              connect(replay, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(updateDownloadProgress(qint64,qint64)));
                                                          
                                                          






                                                            Evgenii Legotckoi
                                                            • Там. 24, 2017, 4:40 Т.Ж.
                                                            • (өңделген)

                                                            Я так сразу и не вспомню.
                                                            Почитайте вот эту статью , я разобрал в ней свои мысли об ошибках QNetworkAccessManager.

                                                              alex_lip
                                                              • Там. 24, 2017, 4:59 Т.Ж.
                                                              • (өңделген)

                                                              ок. Почитаю по этому поводу. ...
                                                              Попробовал так - тоже не работает. Пока сдаюсь.  А есть статьи описывающие работу с отладчиком ?

                                                              void AnimalModel::clearAnimal()
                                                              {
                                                              //    this->beginResetModel();
                                                              
                                                                  beginRemoveRows(QModelIndex(),0,rowCount()-1);
                                                                  int count = rowCount();
                                                                  for (int i = 0; i < count; ++i)
                                                                 m_animals.removeAt(i);
                                                                  endRemoveRows();
                                                              
                                                               //   this->endResetModel();
                                                              
                                                              }
                                                              
                                                                Evgenii Legotckoi
                                                                • Там. 24, 2017, 5:02 Т.Ж.

                                                                Неа. Таких статей нет. Тут скорее видео нужно делать, но у меня этого нет в приоритете.

                                                                  alex_lip
                                                                  • Там. 28, 2017, 7:41 Т.Ж.

                                                                  Вот так почти работает. Если одна строчка - даже правильно. А если в модели несколько строчек - удаляет не все...

                                                                  void AnimalModel::clearAnimal()
                                                                  {
                                                                      int count = rowCount();
                                                                      for (int i = 0; i < count; ++i)
                                                                      {
                                                                      beginRemoveRows(QModelIndex(),i,i);
                                                                      m_animals.removeAt(i);
                                                                      endRemoveRows();
                                                                      }
                                                                  
                                                                  }


                                                                    alex_lip
                                                                    • Там. 28, 2017, 7:51 Т.Ж.
                                                                    • (өңделген)

                                                                    Бред. Если я два раза пишу.

                                                                             m_model->clearAnimal();
                                                                             m_model->clearAnimal();
                                                                    То чистит нормально.  Видимо я не понимаю как реализованы индексы....
                                                                      Evgenii Legotckoi
                                                                      • Там. 28, 2017, 7:51 Т.Ж.

                                                                      Тут скорее с конца надо удалять в самой модели. Что-то вроде такого должно быть.

                                                                      while (!m_animals.isEmpty())
                                                                      {
                                                                          m_animals.removeLast();
                                                                      }
                                                                      Удаляет не всё потому, что когда делаете removeAt(), то размер модели уменьшается и последние i выходят за пределы QList, и таким образом просто ничего не удаляют, поскольку в QList на тех позициях фактически ничего нет.

                                                                      А вот с beginRemoveRows и endRemoveRows немного другая ситуация. Они просто показывают с какой строки по какую вы собираетесь сделать удаление.

                                                                      Фактически в beginRemoveRows для полной очистки нужно указать индекс первой строки и индекс последней строки.
                                                                      То есть в результате должно получиться нечто такое.

                                                                      beginRemoveRows(QModelIndex(), 0, rowCount());
                                                                      while (!m_animals.isEmpty())
                                                                      {
                                                                          m_animals.removeLast();
                                                                      }
                                                                      endRemoveRows();
                                                                        alex_lip
                                                                        • Там. 28, 2017, 8:18 Т.Ж.

                                                                        Спасибо!
                                                                        Наверное вот так все-таки правильнее

                                                                         beginRemoveRows(QModelIndex(), 0, rowCount()-1);
                                                                          Evgenii Legotckoi
                                                                          • Там. 28, 2017, 8:19 Т.Ж.

                                                                          Да. Согласен. Так будет правильнее.

                                                                            alex_lip
                                                                            • Там. 28, 2017, 8:29 Т.Ж.

                                                                            А еще не подскажете (это все про модель-вью) вот в этом примере есть интересная реализация CoverFlow (4)
                                                                            https://habrahabr.ru/post/190090/

                                                                            Там в QML слое вводятся переменный

                                                                            property int itemAngle: 60
                                                                            property int itemSize: 300
                                                                            
                                                                            У меня при компиляции выходит qrc:/main.qml:106 : ReferenceError: itemSize is not defined
                                                                            Куда смотреть? Как их объявить? Это из-за QtQuick 2.7 ?
                                                                            вот код
                                                                            import QtQuick 2.7
                                                                            import QtQuick.Controls 2.0
                                                                            import QtQuick.Layouts 1.0
                                                                            //    import QtQuick 2.0
                                                                            ApplicationWindow {
                                                                                visible: true
                                                                                width: 640
                                                                                height: 480
                                                                                title: qsTr("Hello World")
                                                                                Rectangle {
                                                                                    property int itemAngle: 60
                                                                                    property int itemSize: 300
                                                                            
                                                                                    width: 1200
                                                                                    height: 400
                                                                            
                                                                                    ListModel {
                                                                                        id: dataModel
                                                                            
                                                                                        ListElement {
                                                                                            color: "orange"
                                                                                            text: "first"
                                                                                        }
                                                                                        ListElement {
                                                                                            color: "lightgreen"
                                                                                            text: "second"
                                                                                        }
                                                                                        ListElement {
                                                                                            color: "orchid"
                                                                                            text: "third"
                                                                                        }
                                                                                        ListElement {
                                                                                            color: "tomato"
                                                                                            text: "fourth"
                                                                                        }
                                                                                        ListElement {
                                                                                            color: "skyblue"
                                                                                            text: "fifth"
                                                                                        }
                                                                                        ListElement {
                                                                                            color: "hotpink"
                                                                                            text: "sixth"
                                                                                        }
                                                                                        ListElement {
                                                                                            color: "darkseagreen"
                                                                                            text: "seventh"
                                                                                        }
                                                                                    }
                                                                            
                                                                                    PathView {
                                                                                        id: view
                                                                            
                                                                                        anchors.fill: parent
                                                                                        model: dataModel
                                                                                        pathItemCount: 6
                                                                            
                                                                                        path: Path {
                                                                                            startX: 0
                                                                                            startY: height / 2
                                                                            
                                                                                            PathPercent { value: 0.0 }
                                                                                            PathAttribute { name: "z"; value: 0 }
                                                                                            PathAttribute { name: "angle"; value: itemAngle }
                                                                                            PathAttribute { name: "origin"; value: 0 }
                                                                                            PathLine {
                                                                                                x: (view.width - itemSize) / 2
                                                                                                y: view.height / 2
                                                                                            }
                                                                                            PathAttribute { name: "angle"; value: itemAngle }
                                                                                            PathAttribute { name: "origin"; value: 0 }
                                                                                            PathPercent { value: 0.49 }
                                                                                            PathAttribute { name: "z"; value: 10 }
                                                                            
                                                                            
                                                                                            PathLine { relativeX: 0; relativeY: 0 }
                                                                            
                                                                                            PathAttribute { name: "angle"; value: 0 }
                                                                                            PathLine {
                                                                                                x: (view.width - itemSize) / 2 + itemSize
                                                                                                y: view.height / 2
                                                                                            }
                                                                                            PathAttribute { name: "angle"; value: 0 }
                                                                                            PathPercent { value: 0.51 }
                                                                            
                                                                                            PathLine { relativeX: 0; relativeY: 0 }
                                                                            
                                                                                            PathAttribute { name: "z"; value: 10 }
                                                                                            PathAttribute { name: "angle"; value: -itemAngle }
                                                                                            PathAttribute { name: "origin"; value: itemSize }
                                                                                            PathLine {
                                                                                                x: view.width
                                                                                                y: view.height / 2
                                                                                            }
                                                                                            PathPercent { value: 1 }
                                                                                            PathAttribute { name: "z"; value: 0 }
                                                                                            PathAttribute { name: "angle"; value: -itemAngle }
                                                                                            PathAttribute { name: "origin"; value: itemSize }
                                                                                        }
                                                                                        delegate: Rectangle {
                                                                                            property real rotationAngle: PathView.angle
                                                                                            property real rotationOrigin: PathView.origin
                                                                            
                                                                                            width: itemSize
                                                                                            height: width
                                                                                            z: PathView.z
                                                                                            color: model.color
                                                                                            border {
                                                                                                color: "black"
                                                                                                width: 1
                                                                                            }
                                                                                            transform: Rotation {
                                                                                                axis { x: 0; y: 1; z: 0 }
                                                                                                angle: rotationAngle
                                                                                                origin.x: rotationOrigin
                                                                                            }
                                                                            
                                                                                            Text {
                                                                                                anchors.centerIn: parent
                                                                                                font.pointSize: 32
                                                                                                text: model.text
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                            


                                                                             
                                                                              Evgenii Legotckoi
                                                                              • Там. 28, 2017, 9:02 Т.Ж.

                                                                              Может быть не видит itemSize.
                                                                              Попробуйте добавить id для того Rectangle, где есть это property itemSize:

                                                                               {Rectangle {
                                                                                      id: rectWithSize
                                                                                      property int itemAngle: 60
                                                                                      property int itemSize: 300
                                                                                  // ***
                                                                              }
                                                                              и берите свойство через id
                                                                              rectWithSize.itemSize
                                                                                alex_lip
                                                                                • Там. 28, 2017, 9:18 Т.Ж.

                                                                                Работает! Ура! Спасибо!.

                                                                                  Пікірлер

                                                                                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                                                                  Кіріңіз немесе Тіркеліңіз
                                                                                  OI
                                                                                  • Ora Iro
                                                                                  • Жел. 24, 2024, 5:38 Т.Қ.

                                                                                  C++ - Тест 001. Первая программа и типы данных

                                                                                  • Нәтиже:40ұпай,
                                                                                  • Бағалау ұпайлары-8
                                                                                  AD

                                                                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                                                                  • Нәтиже:50ұпай,
                                                                                  • Бағалау ұпайлары-4
                                                                                  m
                                                                                  • molni99
                                                                                  • Қаз. 26, 2024, 11:37 Т.Ж.

                                                                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                                                                  • Нәтиже:80ұпай,
                                                                                  • Бағалау ұпайлары4
                                                                                  Соңғы пікірлер
                                                                                  ИМ
                                                                                  Игорь МаксимовҚар. 22, 2024, 10:51 Т.Қ.
                                                                                  Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                                                  Evgenii Legotckoi
                                                                                  Evgenii LegotckoiҚар. 1, 2024, 12:37 Т.Ж.
                                                                                  Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                                                  A
                                                                                  ALO1ZEҚаз. 19, 2024, 6:19 Т.Қ.
                                                                                  Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                                                  ИМ
                                                                                  Игорь МаксимовҚаз. 5, 2024, 5:51 Т.Қ.
                                                                                  Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                                                  d
                                                                                  dblas5Шілде 5, 2024, 9:02 Т.Қ.
                                                                                  QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                                                  Енді форумда талқылаңыз
                                                                                  Evgenii Legotckoi
                                                                                  Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
                                                                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                                                  t
                                                                                  tonypeachey1Қар. 15, 2024, 5:04 Т.Қ.
                                                                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                                                  NSProject
                                                                                  NSProjectМаусым 4, 2022, 1:49 Т.Қ.
                                                                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                                                                  9
                                                                                  9AnonimҚаз. 25, 2024, 7:10 Т.Қ.
                                                                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                                                                  Бізді әлеуметтік желілерде бақылаңыз