powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск номера строки в QSqlQueryModel
9 сообщений из 9, страница 1 из 1
Поиск номера строки в QSqlQueryModel
    #38173302
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня!
В неком приложении используется много QComboBox с привязкой к QSqlQueryModel (справочники), в моделях по 500 записей и более. Так при загрузке данных необходимо установить QCombobox'ам текущую запись из модели. Сейчас делаю через цикл for. Данный метод, при больших объемах занимает порядком много времени. Как ускорить операцию установки текущей записи?
В некоторый (для особо больших объемов) использую QCompleter, но не везде это выход.
Спасибо!
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38173477
rovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно пояснить, что значит "текущая запись"?
У QSqlQueryModel нет соответствующего свойства.
А еще лучше - показать код.
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38173537
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rovan,

Текущая запись в QComboBox.

Делаем выборку в модели и устанавливаем для QCombobox модель. В модели не меньше 500 записей!!
Код: plaintext
1.
2.
3.
4.
 
    universModel->setQuery("SELECT un_id,un_name FROM universities  ORDER BY un_name");
    ui->cmbUnivers->setModel(universModel);
    ui->cmbUnivers->setModelColumn(1);



Нужно установить ьтекущую запись с un_id = 430, что нужно для этого сделать?
Код: plaintext
1.
2.
3.
4.
5.
6.
for (int i = 0; i < model->rowCount(); i++) {
        if (model->data(model->index(i,col)) == index) {
            result = i;
            break;
        }
    }



Проходим в цикле, и ищим нужное нам un_id, если находим то ставим текущую запись QCombobox'а равное i.]

Такой подход изначально неверен, но другого я не знаю.
Что можно здесь сделать? Как ускорить? Когда записей 10-100, это не заметно, но когда их переваливает за 500, а если еще и не одна такая модель, то это затягивается на долго!
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38174077
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wulff, вот этот цикл, когда записей в модели 100000, у меня выполняется максимум за 200мс.
Код: plaintext
1.
2.
3.
4.
5.
6.
for (int i = 0; i < model->rowCount(); i++) {
        if (model->data(model->index(i,col)) == index) {
            result = i;
            break;
        }
    }


Может основная задержка в получении данных из БД?
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38174160
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_Sla,

Все верно! Задержки со стороны БД нет однозначно.
Этот код выполняется быстро, относительно одной модели, но когда их больше чем 1, то задержка уже становится ощутимой.
Например сейчас в проекте таких моделей 9, понимаете о чем я? В среднем задержка выходит около 1 - 1.5 сек. Не критично в принципе, но на глаз видно.
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38176019
rovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
for (int i = 0; i < model->rowCount(); i++) {
       if (model->data(model->index(i,col)) == index) {
            result = i;
            break;
        }
    }


Что это и откуда берётся?
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38176036
rovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется в виду переменная index. Не выделилась.
...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38176062
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wulffm_Sla,
Все верно! Задержки со стороны БД нет однозначно.
Этот код выполняется быстро, относительно одной модели, но когда их больше чем 1, то задержка уже становится ощутимой.
Например сейчас в проекте таких моделей 9, понимаете о чем я? В среднем задержка выходит около 1 - 1.5 сек. Не критично в принципе, но на глаз видно.Цикл вносит минимальную задержку. Ищи затык в другом месте.

Для примера написал приложение с 5 моделями по 100000 записей в каждой. Задержка в среднем 200мс. При 500 записей задержку вообще не увидешь.
button_click_handler.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#ifndef BUTTON_CLICK_HANDLER_H
#define BUTTON_CLICK_HANDLER_H

#include <QObject>
#include <QtGui>

class button_click_handler : public QObject
{
    Q_OBJECT
public:
    explicit button_click_handler(QObject *parent = 0);

signals:

public slots:
    void button_is_pressed();

};

#endif // BUTTON_CLICK_HANDLER_H


button_click_handler.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
#include "button_click_handler.h"

extern QStandardItemModel *model1;
extern QStandardItemModel *model2;
extern QStandardItemModel *model3;
extern QStandardItemModel *model4;
extern QStandardItemModel *model5;

extern QComboBox *box1;
extern QComboBox *box2;
extern QComboBox *box3;
extern QComboBox *box4;
extern QComboBox *box5;

extern QLabel *label;

//------------------------------------------
int get_result(QStandardItemModel *model, QString search_num)
{
    int result=0;
    for(int i = 0; i < model->rowCount(); i++)
    {
        if (model->data(model->index(i,0)) == search_num)
        {
            result = i;
            break;
        }
    }

    return result;
}
//----------------------------------------------------------
button_click_handler::button_click_handler(QObject *parent) :
    QObject(parent)
{
}
//----------------------------------------------------------
void button_click_handler::button_is_pressed()
{
    QTime t;
    t.start();

    box1->setCurrentIndex(get_result(model1, "item0_255"));
    box2->setCurrentIndex(get_result(model2, "item0_99997"));
    box3->setCurrentIndex(get_result(model3, "item0_99998"));
    box4->setCurrentIndex(get_result(model4, "item0_49999"));
    box5->setCurrentIndex(get_result(model5, "item0_99999"));

    label->setText(QString::number(t.elapsed()));
}


main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
#include <QtGui/QApplication>
#include <QtGui>
#include "button_click_handler.h"

QStandardItemModel *model1;
QStandardItemModel *model2;
QStandardItemModel *model3;
QStandardItemModel *model4;
QStandardItemModel *model5;

QTableView *pTableView;
QComboBox *box1;
QComboBox *box2;
QComboBox *box3;
QComboBox *box4;
QComboBox *box5;

QLabel *label;

//------------------------------------------
void init_model(QStandardItemModel *model, int imax)
{
    QModelIndex index;
    for(int i=0;i<imax;i++)
    {
        index=model->index(i,0);
        model->setData(index,"item0_"+QString::number(i));

        index=model->index(i,1);
        model->setData(index,"item1_"+QString::number(i));
    }
}
//------------------------------------------
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    //MainWindow w;
    //w.show();

    QWidget wgt;

    const int MAX=100000;
    model1=new QStandardItemModel(MAX,2);
    model2=new QStandardItemModel(MAX,2);
    model3=new QStandardItemModel(MAX,2);
    model4=new QStandardItemModel(MAX,2);
    model5=new QStandardItemModel(MAX,2);

    init_model(model1,MAX);
    init_model(model2,MAX);
    init_model(model3,MAX);
    init_model(model4,MAX);
    init_model(model5,MAX);

    pTableView = new QTableView;
    pTableView->setModel(model1);

    box1=new QComboBox;
    box1->setModel(model1);
    box2=new QComboBox;
    box2->setModel(model2);
    box3=new QComboBox;
    box3->setModel(model3);
    box4=new QComboBox;
    box4->setModel(model4);
    box5=new QComboBox;
    box5->setModel(model5);

    QPushButton *button=new QPushButton("Press button");
    button_click_handler *button_handler=new button_click_handler;
    QObject::connect(button,SIGNAL(clicked()),button_handler,SLOT(button_is_pressed()));


    label=new QLabel("label");

    QHBoxLayout *layout=new QHBoxLayout;
    layout->addWidget(pTableView);
    layout->addWidget(box1);
    layout->addWidget(box2);
    layout->addWidget(box3);
    layout->addWidget(box4);
    layout->addWidget(box5);
    layout->addWidget(button);
    layout->addWidget(label);
    wgt.setLayout(layout);

    wgt.show();

    return app.exec();
}

...
Рейтинг: 0 / 0
Поиск номера строки в QSqlQueryModel
    #38178173
Wulff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хмм... ну тогда буду копать в другую сторону, всем спасибо!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск номера строки в QSqlQueryModel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]