alex_lip
June 28, 2017, 12:46 p.m.

от QT к QML

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

3

Do you like it? Share on social networks!

6
alex_lip
  • June 29, 2017, 4:22 p.m.
  • The answer was marked as a solution.

Сам себе напишу ответ. Может быть кому-то пригодится.. Все делается также через контекст.
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
    • June 29, 2017, 4:25 p.m.

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

      Evgenii Legotckoi
      • July 1, 2017, 12:04 a.m.

      Добрый день.

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

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

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

      Делегат подчиняется всем правилам вёрстки в QML, так что это просто дополнительный графический компонент, который нужно сверстать.

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

        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 позволяют работать с моделями данных и редактировать их, при соответствующей логике в программе.

            ВА
            • June 27, 2019, 2:53 p.m.
            • (edited)

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

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

              Comments

              Only authorized users can post comments.
              Please, Log in or Sign up
              • Last comments
              • AK
                April 24, 2025, 12:04 p.m.
                UPD: Переписал логику воспроизведения через стороннюю библиотеку BASS. Там выбрать можно
              • Evgenii Legotckoi
                April 16, 2025, 5:08 p.m.
                Благодарю за отзыв. И вам желаю всяческих успехов!
              • IscanderChe
                April 12, 2025, 5:12 p.m.
                Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
              • AK
                April 1, 2025, 11:41 a.m.
                Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
              • Evgenii Legotckoi
                March 9, 2025, 9:02 p.m.
                К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…