Russian Qt Forum
Сентябрь 30, 2024, 12:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Кто как загружает QComboBox из БД  (Прочитано 12668 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Июль 29, 2009, 16:18 »

Вобщем интересут кто как загружает QComboBox из базы данных

я делаю так, у меня есть функция

Код:
void LoadComboBox(QComboBox *obj,QString str)
{
           obj->clear();
           QSqlQuery query;
           QString que;

           QStringList combolist;

           que = "select name from "+str+" order by id";


if (!query.exec(que))
{
QMessageBox::critical(this,tr("Error load param"),tr("Can not load param"));
}else
{
while (query.next())
{
combolist << query.value(0).toString();
}

obj->addItems(combolist);

for (int i = 0;i<combolist.count();i++)
{
obj->setItemData(i,combolist.at(i),Qt::ToolTipRole);
}

QCompleter *completer = new QCompleter(combolist, this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
obj->setCompleter(completer);
}
}

Ну вот а при заполнении нужно вписать нужный комбобокс и таблицу из которой заполнять, меня интеесует хорошо ли я делаю, может есть варианты полудше, как это будет работать при большом наборе данных?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 29, 2009, 16:38 »

Можно создать модельку и прицепить ее к комбе. Так будет лучше.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
CroCIV
Гость
« Ответ #2 : Июль 30, 2009, 09:38 »

вместо QSqlQuery
юзай этот
QSqlQueryModel
даешь ему запрос, выполняешь
затем у QComboBox пользуешь эту чф void setModel ( QAbstractItemModel * model )
примерно так:
Код:
QSqlQueryModel *йцу(этот);
цйу->setQuery("запрос", подключениекбд);
QComboBox *ыва;
ыва->setModel(цйу);
ыва->setModelColumn ( int номеротображаемогостолбцамоделкиначинаяотнуля ) ;

Все, комбик сам получет данные из моделькии цйу, моделька хранит записи из бд, изменения сделаные в модели на данные в бд не влияют (очевидно).
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Июль 30, 2009, 10:21 »

Хорошо а в чём преимущество загрузки через модель? По времени примерно одинаково, я потестил.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Июль 30, 2009, 11:42 »

На каком объеме данных тестил?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Июль 30, 2009, 12:34 »

2220 записей. Ну так бы получается то первый метод быстрее то второй но в среднем одинаково.
Записан
CroCIV
Гость
« Ответ #6 : Июль 30, 2009, 13:09 »

удобнее использовать модель, надежнее использовать модель, нагляднее использовать модель. Вопросы?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Июль 30, 2009, 14:43 »

Удобнее использовать модель тем что кода меньше? Некоем случаем это не наезд ну просто действительно интересно Улыбающийся
В этом примере сразу и сортировка добавлена и tolTips-ы для каждого итема.

С наглядностью может где то даже согласен, а надежность в чем проявляется?
Записан
CroCIV
Гость
« Ответ #8 : Июль 31, 2009, 13:06 »

Удобство:
 ну на сколько я знаю, одну и ту же модель можно подключить сразу к потенциально не ограниченному кол-ву компонент (умеющих работать с куте), не всегда, но иногда это очень удобно и "слегка" рациональнее расходуется память, и возможные изменения в модели отслеживать не надо (это я подозреваю)

Надежность это следствие наглядности кода, чем меньше собственного кода - тем ниже вероятность в нем ошибиться.
Не спорю, можно одну и ту же задачу решить и на Си, можно вообще от компонентного и обьектно-ориентированного подхода отойти и на ассемблере фигачить, и даже сразу минуя компилятор в двоичных кодах реализовать исполняемый файл, только мне кажется это "чуть-чуть" не рациональным  Смеющийся
Записан
CroCIV
Гость
« Ответ #9 : Июль 31, 2009, 13:08 »

*умеющих работать с моделями, конечно же Смеющийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #10 : Июль 31, 2009, 13:23 »

Ну ладно с моделями разобрались, довольно хороший вариант, ну может есть ещё какие нибудь способы или алгоритмы для загрузки QComboBox.
Записан
ildar
Гость
« Ответ #11 : Сентябрь 29, 2009, 21:22 »

если загружать комбо из модели как получить соответствие "комбо индекс" <=> "id в таблице"?

например
Код:
QSqlQueryModel* model = ...;
model->setQuery("select id, title from ...");
QComboBox *combo = ...;
combo->setModel(model);
combo->setModelColumn (1) ;
combo->setModelKeyColumn(0); <---- что нибудь типа такого

ну или как вариант combo->setItemData ( int index, const QVariant & value, int role = Qt::UserRole ), но как сказать комбобоксу использовать id для Qt::UserRole?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Сентябрь 29, 2009, 21:31 »

В общем случае Id в таблице может начинатся не с нуля и идти не попорядку. Поэтому простого сопоставления нет.
Записан

Юра.
ildar
Гость
« Ответ #13 : Сентябрь 30, 2009, 08:36 »

а кто какие велосипеды использует?
Записан
CroCIV
Гость
« Ответ #14 : Сентябрь 30, 2009, 08:50 »

Будем считать что я тут ниче не писал ))
« Последнее редактирование: Сентябрь 30, 2009, 10:32 от CroCIV » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.18 секунд. Запросов: 23.