Виталий Антипов
Виталий Антипов22 января 2018 г. 19:53

256 строк в модели данных

Здравствуйте! У меня задача отправить данные из sqlite базы в Bars3D. Для этого, по вашим урокам, подготавливаю модель и роли в с++ и отправляю в qml ItemModelBarDataProxy. Все хорошо, когда количество строк меньше 256, но когда больше - на 3D графике только первые 256. console.log(model.rowCount()) = 256, хотя реально 342. Подскажите, как можно выкрутиться из этой ситуации?

listmodel.cpp
ListModel1V::ListModel1V(QObject *parent) :
    QSqlQueryModel(parent)
{
    this->updateModel();
}

// Метод для получения данных из модели
QVariant ListModel1V::data(const QModelIndex & index, int role) const {

    // Определяем номер колонки, адрес так сказать, по номеру роли
    int columnId = role - Qt::UserRole - 1;
    // Создаём индекс с помощью новоиспечённого ID колонки
    QModelIndex modelIndex = this->index(index.row(), columnId);

    /* И с помощью уже метода data() базового класса
     * вытаскиваем данные для таблицы из модели
     * */
    return QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
}

// Метод для получения имен ролей через хешированную таблицу.
QHash<int, QByteArray> ListModel1V::roleNames() const {
    /* То есть сохраняем в хеш-таблицу названия ролей
     * по их номеру
     * */
    QHash<int, QByteArray> roles;
    roles[IdRole] = "id";
    roles[bazaizm_1vRole] = "bazaizm1v";
    roles[bazaizm_dataRole] = "bazaizmdata";
    roles[bazaizm_naprRole] = "bazaizmnapr";
    return roles;
}

// Метод обновления таблицы в модели представления данных
void ListModel1V::updateModel()
{
    QObject* stack = this->parent()->findChild<QObject*>("stackView");
    QString kks_id=(stack->property("baza_id")).toString();
    QString rezhim_id=(stack->property("rezhim_id")).toString();
    QString rezhim_filter = " and BazaIzmereni.id_Rezhim = " + rezhim_id;

    if(rezhim_id == ""){
        rezhim_filter = "";
    }
    qDebug() << rezhim_id;
    QSqlQuery query1V;
    QString select1V = QString ("SELECT COUNT(BazaIzmereni.id) FROM BazaIzmereni WHERE BazaIzmereni.id_Baza = " + kks_id + " and BazaIzmereni.'1В' is not null" + rezhim_filter);
    if (!query1V.exec(select1V)){
        qDebug() << "ошибка: " << query1V.lastError().text();
    }
            query1V.next();
    if(query1V.value(0)==0){
        select1V = "";
    } else {
        select1V = " SELECT BazaIzmereni.id, IFNULL(BazaIzmereni.'1В', 0), strftime('%d-%m-%Y', Дата)||' '||IFNULL(BazaIzmereni.'Время', 0), '1В', BazaIzmereni.Дата, BazaIzmereni.'Время' FROM BazaIzmereni WHERE BazaIzmereni.id_Baza = " + kks_id + rezhim_filter;
    };
    QSqlQuery query1P;
    QString select1P = QString ("SELECT COUNT(BazaIzmereni.id) FROM BazaIzmereni WHERE BazaIzmereni.id_Baza = " + kks_id + " and BazaIzmereni.'1П' is not null" + rezhim_filter);
        if (!query1P.exec(select1P))
        qDebug() << "error: " << query1P.lastError().text();
            query1P.next();
    if(query1P.value(0)==0){
        select1P = "";
    } else {
        select1P = " UNION ALL SELECT BazaIzmereni.id, IFNULL(BazaIzmereni.'1П', 0), strftime('%d-%m-%Y', Дата)||' '||IFNULL(BazaIzmereni.'Время', 0), '1П', BazaIzmereni.Дата, BazaIzmereni.'Время' FROM BazaIzmereni WHERE BazaIzmereni.id_Baza = " + kks_id + rezhim_filter;
    };
    //...............................здесь однотипный код............................................
    QSqlQuery query8O;
    QString select8O = QString ("SELECT COUNT(BazaIzmereni.id) FROM BazaIzmereni WHERE BazaIzmereni.id_Baza = " + kks_id + " and BazaIzmereni.'8О' is not null" + rezhim_filter);
        if (!query8O.exec(select8O))
        qDebug() << "error: " << query8O.lastError().text();
            query8O.next();
    if(query8O.value(0)==0){
        select8O = "";
    } else {
        select8O = " UNION ALL SELECT BazaIzmereni.id, IFNULL(BazaIzmereni.'8О', 0), strftime('%d-%m-%Y', Дата)||' '||IFNULL(BazaIzmereni.'Время', 0), '8О', BazaIzmereni.Дата, BazaIzmereni.'Время' FROM BazaIzmereni WHERE BazaIzmereni.id_Baza = " + kks_id + rezhim_filter;
    };
    //Обновление производится SQL-запросом к базе данных
    this->setQuery(select1V + select1P + select1O + select2V + select2P + select2O + select3V + select3P + select3O + select4V + select4P + select4O + select5V + select5P + select5O + select6V + select6P + select6O + select7V + select7P + select7O + select8V + select8P + select8O + " order by 5 asc, 6 asc");
}

// Получение id из строки в модели представления данных
int ListModel1V::getId(int row)
{
    return this->data(this->index(row, 0), IdRole).toInt();
}
OpenBO.qml
ColorGradient {
                        id: surfaceGradient
                        ColorGradientStop { id: startGradient; position: 0.0; color: "green" }
                        ColorGradientStop { id: middleGradient; position: 0.75; color: "yellow" }
                        ColorGradientStop { id: finishGradient; position: 1.0; color: "red" }
                    }
                    Bars3D {
                        id: barGraph
                        Material.theme: Material.Light
                        anchors.fill: parent
                        barThickness: 2
                        antialiasing: true
                        reflection: true
                        theme: Theme3D {
                            type: Theme3D.ThemeQt
                            font.family: "STCaiyun"
                            font.pointSize: 25
                            colorStyle: Theme3D.ColorStyleRangeGradient
                            baseGradients: [surfaceGradient]
                            windowColor: "white"
                            labelBackgroundEnabled: false
                            backgroundEnabled: true
                            backgroundColor: "transparent"
                            gridEnabled: true
                            gridLineColor: "black"
                            labelTextColor: "blue"
                            multiHighlightColor: "red"
                            singleHighlightColor: "white"
                        }
                        selectionMode: AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice
                        scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
                        Bar3DSeries {
                            id: station1
                            name: "Station 1"
                            ItemModelBarDataProxy {
                                id: proxy
                                itemModel: model_1V
                                rowRole: "bazaizmnapr"
                                columnRole: "bazaizmdata"
                                valueRole: "bazaizm1v"
                            }
                            onSelectedBarChanged: {
                                rec_prim_izmer.visible = true
                                list1.currentIndex = list1.count -1 - parseInt([position.y])
                                newindex = list1.currentIndex
                                item4.editEntry(newindex)
                                barGraph.selectionMode = AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice
                                console.log(list1.currentIndex)
                            }
                        }
                        Component.onCompleted: {
                            console.log(model_1V.rowCount()) //qml: 256                            
                            }
                        }
                }
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

2
Виталий Антипов
  • 22 января 2018 г. 20:41
  • Ответ был помечен как решение.

Извиняюсь, нашел ответ тут http://www.qtcentre.org/threads/54533-QSqlQueryModel-%E2%80%98s-method-rowcount()-return-256

if(this->canFetchMore()){
        this->fetchMore();
    }
Проблема вроде решена.
    Виталий Антипов
    • 26 января 2018 г. 13:53

    Внесу дополнение. Правильнее заменить if на while:

    while(this->canFetchMore()){
            this->fetchMore();
        }
    иначе получим ограничение в 512 строк, а qDebug()<<this->canFetchMore(); останется true при количестве строк >512.

      Комментарии

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

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

      • Результат:70баллов,
      • Очки рейтинга1
      РК

      Qt - Тест 001. Сигналы и слоты

      • Результат:84баллов,
      • Очки рейтинга4
      ВМ

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

      • Результат:80баллов,
      • Очки рейтинга4
      Последние комментарии
      d
      dblas55 июля 2024 г. 21:02
      QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
      k
      kmssr9 февраля 2024 г. 5:43
      Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      АК
      Анатолий Кононенко5 февраля 2024 г. 12:50
      Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      EVA
      EVA25 декабря 2023 г. 21:30
      Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
      J
      JonnyJo25 декабря 2023 г. 19:38
      Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
      Сейчас обсуждают на форуме
      BlinCT
      BlinCT25 июня 2024 г. 11:00
      Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
      Evgenii Legotckoi
      Evgenii Legotckoi25 июня 2024 г. 1:11
      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
      BlinCT
      BlinCT5 мая 2024 г. 15:46
      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
      Evgenii Legotckoi
      Evgenii Legotckoi3 мая 2024 г. 0:07
      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
      IscanderChe
      IscanderChe30 апреля 2024 г. 14:22
      Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

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