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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Заполнение QComboBox из БД  (Прочитано 5890 раз)
qks1
Гость
« : Август 05, 2012, 02:39 »

Здравствуйте!
Есть в БД таблица с деталями, каждая деталь имеет несколько параметров (пусть будет до 10), столбцы с ними имеют имена par1, par2, ..., par10. В программе есть поисковик по деталям, в поисковике несколько комбобоксов, по максимальному кол-ву параметров (т.е. 10). Первый комбобокс заполняется значениями par1, второй - значениями par2 и так далее до 10. Естественно, при выборе строки в одном из комбобоксов происходит выбор из БД соответствующих строк. В поисковике есть и другие фильтры (по названию, по цене и т.д.), соответственно, при каждом новом поиске надо производить перезаполнение комбобоксов. Кусок кода, отвечающий за это:

Код
C++ (Qt)
void Searcher::get_params_list(QString where){
   // where - сформированная ранее строка, хранящая WHERE для запроса
   QString query_str, par_name;
   QStringList list;
   QSqlQuery query;
 
   for(int i = 0; i < MAX_PARAMS; i++){
       par_name = "par" + QString::number(i+1);
       selectors.at(i)->clear();        // selectors - это QList комбобоксов
       query_str = "SELECT DISTINCT " + par_name + " FROM details " + where + " AND " + par_name + " != ''" + " ORDER BY " + par_name;
       if(!query.exec(query_str)){
           QMessageBox::warning(0, "Ошибка при выборе параметров", query.lastError().text());
           break;
       }
       else if(query.size() == 0){
           // если список пуст, делаем комбобокс неактивным
           selectors.at(i)->setEnabled(false);
       }
       else{
           while(query.next())
               list << query.value(0).toString();
           if(query.size() == 1)
               selectors.at(i)->setCurrentIndex(1);
           selectors.at(i)->setEnabled(true);
           selectors.at(i)->addItems(list);
           list.clear();
       }
   }
}
 

Формирование комбобоксов занимает ощутимое время (около двух-трёх секунд), что нехорошо, т.к. условия поиска могут меняться довольно часто. Основное время, как я понимаю, занимает проход циклом по результату запроса. Можно ли как-нибудь быстро преобразовать запрос из одного столбца в QStringList? Или, может, будут другие предложения, как ускорить процесс?
Заранее всем спасибо.
Записан
Странник
Гость
« Ответ #1 : Август 05, 2012, 06:16 »

почитайте о Model/View. для выборки данных используйте QSqlQueryModel и устанавливайте ее с помощью QComboBox::setModel. не исключено, впрочем, что узкое место у вас - БД, но хотя бы реализовано будет по-человечески = ) идея такова:
Код:
QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery("SELECT DISTINCT " + par_name + " FROM details " + where + " AND " + par_name + " != ''" + " ORDER BY " + par_name;);
comboBox->setModel(model);
« Последнее редактирование: Август 05, 2012, 06:21 от Странник » Записан
qks1
Гость
« Ответ #2 : Август 05, 2012, 16:08 »

А слона-то я... По QSqlQuery и QSqlQueryModel документацию перелопатил, а по QComboBox как-то невнимательно  Непонимающий
Спасибо большое!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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