alex_lip
alex_lip28 июня 2017 г. 2:46

от QT к QML

Добрый день.
Большое спасибо вам за ваши уроки.  Можете смело издавать книгу "100 первых уроков для QT/QML".
Теперь вопрос. Я сделал на QT разбор JSON файла (который я получаю с сайта при помощи networkadapter). Получил таблицу. На QT все работает. Теперь хочу эту таблицу показать в слое QML.
Благодаря уроку сигналы и слоты в QML передал в слой QML  одну ячейку из этой таблицы в текстовое поле. Все хорошо.
Но теперь "завис" никак не пойму как мне на основе разобранного JSON файла создать модель и передать ее на слой QML например в ListView. Количество полей мне заранее известно. Урок с примером Передача данных из QSqlQueryModel в Qml TableView для меня оказался слишком сложным. Можете на каком-то более простом примере пояснить?

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

Вам это нравится? Поделитесь в социальных сетях!

6
alex_lip
  • 29 июня 2017 г. 6:22
  • Ответ был помечен как решение.

Сам себе напишу ответ. Может быть кому-то пригодится.. Все делается также через контекст.
QT

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
 
    QStringList dataList;
    dataList.append("Item 1");
    dataList.append("Item 2");
    dataList.append("Item 3");
    dataList.append("Item 4");
 
    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();
}


QML

 ListView {
                width: 100; height: 100
 
                model: myModel
                delegate: Rectangle {
                    height: 25
                    width: 100
                    Text { text: modelData }
                }
    alex_lip
    • 29 июня 2017 г. 6:25

    Единственно что непонятно - какого хрена в QtQuick.Controls 2.0 нет объекта TableView (в 1.4 - он есть!)
    Как мне таблицу рисовать - непонятно...

      Evgenii Legotckoi
      • 30 июня 2017 г. 14:04

      Добрый день.

      Угораздило вас спросить, пока я был в переезде в другую страну.

      Вы молодец, нормальное решение.

      Что касается TableView, то я тоже был огорчён, когда увидел, что TableView отсутствует. Выкрутиться можно несколько иначе. Сделать Delegate для ListView, который будет формировать строку и оформление этой строки. Например вот в статье есть delegate для ListView в QML. Полагаю, что возможность рисования своего делегата для строки в ListView и сподвигло разработчиков не заморачиваться с отдельным TableView . Хотя это и прискорбно.

      Делегат подчиняется всем правилам вёрстки в QML, так что это просто дополнительный графический компонент, который нужно сверстать.
        ВА
        • 25 июня 2019 г. 23:35

        Это возможно удивит, а может и нет))) так тоже работает:

        Text {
                            id: page_text
                            anchors.fill: parent
                            textFormat: Text.RichText
                            text: "<table border=\"1\">
        <caption>Таблица размеров обуви</caption>
        <tr>
        <th>Россия</th>
        <th>Великобритания</th>
        <th>Европа</th>
        <th>Длина ступни, см</th>
        </tr>
        <tr><td>34,5</td><td>3,5</td><td>36</td><td>23</td></tr>
        <tr><td>35,5</td><td>4</td><td>36⅔</td><td>23–23,5</td></tr>
        <tr><td>36</td><td>4,5</td><td>37⅓</td><td>23,5</td></tr>
        <tr><td>36,5</td><td>5</td><td>38</td><td>24</td></tr>
        <tr><td>37</td><td>5,5</td><td>38⅔</td><td>24,5</td></tr>
        <tr><td>38</td><td>6</td><td>39⅓</td><td>25</td></tr>
        <tr><td>38,5</td><td>6,5</td><td>40</td><td>25,5</td></tr>
        <tr><td>39</td><td>7</td><td>40⅔</td><td>25,5–26</td></tr>
        <tr><td>40</td><td>7,5</td><td>41⅓</td><td>26</td></tr>
        <tr><td>40,5</td><td>8</td><td>42</td><td>26,5</td></tr>
        <tr><td>41</td><td>8,5</td><td>42⅔</td><td>27</td></tr>
        <tr><td>42</td><td>9</td><td>43⅓</td><td>27,5</td></tr>
        <tr><td>43</td><td>9,5</td><td>44</td><td>28</td></tr>
        <tr><td>43,5</td><td>10</td><td>44⅔</td><td>28–28,5</td></tr>
        <tr><td>44</td><td>10,5</td><td>45⅓</td><td>28,5–29</td></tr>
        <tr><td>44,5</td><td>11</td><td>46</td><td>29</td></tr>
        <tr><td>45</td><td>11,5</td><td>46⅔</td><td>29,5</td></tr>
        <tr><td>46</td><td>12</td><td>47⅓</td><td>30</td></tr>
        <tr><td>46,5</td><td>12,5</td><td>48</td><td>30,5</td></tr>
        <tr><td>47</td><td>13</td><td>48⅔</td><td>31</td></tr>
        <tr><td>48</td><td>13,5</td><td>49⅓</td><td>31,5</td></tr>
        </table>"
                        }
        

          Да, работает. Но это решение подходит в основном для отоюражения статической информацию, которая не меняется. А TableView или ListView позволяют работать с моделями данных и редактировать их, при соответствующей логике в программе.

            ВА
            • 27 июня 2019 г. 4:53
            • (ред.)

            Да это так... просто какого было мое удивление, хоть и поддерживается html на уровне 4-ки можно не тянуть тяжеловесный WebEngine в ряде случаев, например для печати данных в табличном виде, ведь таблицы бывают сложными, html в этом случае палочка выручалочка, единственно не смог повернуть текст в ячейке на 90 градусов:(
            Может както и можно, буду рад узнать.
            Такой вариант не канает:

            <p  style="transform: rotate(-90deg);">Техн.<br>треб.</p>
            
            • может еще актуально, нашел на гитхабе на 2-х контролах Таблицу:
              https://github.com/valeksan/QMLTable
              Правда не успел опробывать, отпишетесь если понравится, там и мои контролы есть, на моей странице:)

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              B

              C++ - Тест 002. Константы

              • Результат:16баллов,
              • Очки рейтинга-10
              B

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

              • Результат:46баллов,
              • Очки рейтинга-6
              FL

              C++ - Тест 006. Перечисления

              • Результат:80баллов,
              • Очки рейтинга4
              Последние комментарии
              k
              kmssr8 февраля 2024 г. 15:43
              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко4 февраля 2024 г. 22:50
              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              EVA
              EVA25 декабря 2023 г. 7:30
              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
              J
              JonnyJo25 декабря 2023 г. 5:38
              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
              G
              Gvozdik18 декабря 2023 г. 18:01
              Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
              Сейчас обсуждают на форуме
              P
              Pisych27 февраля 2023 г. 1:04
              Как получить в массив значения из связанной модели? Спасибо, разобрался:))
              AC
              Alexandru Codreanu19 января 2024 г. 8:57
              QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
              BlinCT
              BlinCT27 декабря 2023 г. 5:57
              Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
              Дмитрий
              Дмитрий10 января 2024 г. 1:18
              Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
              Evgenii Legotckoi
              Evgenii Legotckoi12 декабря 2023 г. 3:48
              Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

              Следите за нами в социальных сетях