Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск номера строки в QSqlQueryModel / 9 сообщений из 9, страница 1 из 1
04.03.2013, 14:07
    #38173302
Wulff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
Всем доброго дня!
В неком приложении используется много QComboBox с привязкой к QSqlQueryModel (справочники), в моделях по 500 записей и более. Так при загрузке данных необходимо установить QCombobox'ам текущую запись из модели. Сейчас делаю через цикл for. Данный метод, при больших объемах занимает порядком много времени. Как ускорить операцию установки текущей записи?
В некоторый (для особо больших объемов) использую QCompleter, но не везде это выход.
Спасибо!
...
Рейтинг: 0 / 0
04.03.2013, 15:51
    #38173477
rovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
Можно пояснить, что значит "текущая запись"?
У QSqlQueryModel нет соответствующего свойства.
А еще лучше - показать код.
...
Рейтинг: 0 / 0
04.03.2013, 16:30
    #38173537
Wulff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
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
05.03.2013, 06:22
    #38174077
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
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
05.03.2013, 09:39
    #38174160
Wulff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
m_Sla,

Все верно! Задержки со стороны БД нет однозначно.
Этот код выполняется быстро, относительно одной модели, но когда их больше чем 1, то задержка уже становится ощутимой.
Например сейчас в проекте таких моделей 9, понимаете о чем я? В среднем задержка выходит около 1 - 1.5 сек. Не критично в принципе, но на глаз видно.
...
Рейтинг: 0 / 0
06.03.2013, 13:58
    #38176019
rovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
Код: 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
06.03.2013, 14:07
    #38176036
rovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
Имеется в виду переменная index. Не выделилась.
...
Рейтинг: 0 / 0
06.03.2013, 14:27
    #38176062
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
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
08.03.2013, 18:21
    #38178173
Wulff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск номера строки в QSqlQueryModel
Хмм... ну тогда буду копать в другую сторону, всем спасибо!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск номера строки в QSqlQueryModel / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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