Виталий Антипов
Виталий Антипов22. Januar 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

2
Виталий Антипов
  • 22. Januar 2018 20:41
  • Die Antwort wurde als Lösung markiert.

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

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

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

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

      Kommentare

      Nur autorisierte Benutzer können Kommentare posten.
      Bitte Anmelden oder Registrieren
      Letzte Kommentare
      A
      ALO1ZE19. Oktober 2024 08:19
      Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
      ИМ
      Игорь Максимов5. Oktober 2024 07:51
      Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
      d
      dblas55. Juli 2024 11:02
      QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
      k
      kmssr8. Februar 2024 18:43
      Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      Jetzt im Forum diskutieren
      J
      JacobFib17. Oktober 2024 03:27
      добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
      JW
      Jhon Wick1. Oktober 2024 15:52
      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…
      КГ
      Кирилл Гусарев27. September 2024 09:09
      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
      F
      Fynjy22. Juli 2024 04:15
      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

      Folgen Sie uns in sozialen Netzwerken