Russian Qt Forum

Qt => Базы данных => Тема начата: qks1 от Август 05, 2012, 02:39



Название: Заполнение QComboBox из БД
Отправлено: 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? Или, может, будут другие предложения, как ускорить процесс?
Заранее всем спасибо.


Название: Re: Заполнение QComboBox из БД
Отправлено: Странник от Август 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);


Название: Re: Заполнение QComboBox из БД
Отправлено: qks1 от Август 05, 2012, 16:08
А слона-то я... По QSqlQuery и QSqlQueryModel документацию перелопатил, а по QComboBox как-то невнимательно  ???
Спасибо большое!