Russian Qt Forum

Qt => Базы данных => Тема начата: smartchecker от Май 17, 2012, 14:33



Название: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: smartchecker от Май 17, 2012, 14:33
Есть на форме несколько combobox'ов.
Как их правильно заполнять?

Надо ли делать такие извращения по каждому combobox'у?
Код
C++ (Qt)
   formatsModel = new QSqlTableModel(this, QSqlDatabase::database(connectionName));
   formatsModel->setTable("formats");
   formatsModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
   formatsIdx = formatsModel->fieldIndex("id");
   formatsModel->select();
 
   ui->formatComboBox->setModel(formatsModel);
   ui->formatComboBox->setModelColumn(formatsModel->fieldIndex("format"));
 
   formatsMapper = new QDataWidgetMapper(this);
   formatsMapper->setModel(formatsModel);
   formatsMapper->addMapping(ui->formatComboBox, formatsIdx);
 
Или проще
Код
C++ (Qt)
   query = QSqlQuery(QSqlDatabase::database(connectionName));
   query.exec("SELECT `language` FROM langs ORDER BY `id`");
 
   QSqlRecord rec = query.record();
   int langCol = rec.indexOf("language");
   while (query.next()) {
       ui->langComboBox->addItem(query.value(langCol).toString());
   }
 
Основная цель - потом мне нужно в другую таблицу записать соотв. id.


Название: Re: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: VozaMFC от Май 17, 2012, 15:43
Если правильно понял...то я бы использовал бы модель данных - если используемые данные одинаковые.
Или еще так:
Код:
    ... 
    query = QSqlQuery(QSqlDatabase::database(connectionName));
    query.exec("SELECT `language` FROM langs ORDER BY `id`");
 
    QSqlRecord rec = query.record();
    int langCol = rec.indexOf("language");
    while (query.next()) {
        ui->langComboBox1->addItem(query.value(langCol).toString());
        ui->langComboBox2->addItem(query.value(langCol).toString());
        ...
        ui->langComboBoxX->addItem(query.value(langCol).toString());
    }
    ...


Название: Re: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: smartchecker от Май 17, 2012, 15:56
Не, в разные combobox'ы идут данные из разных таблиц.

Ситуация стандартная - есть несколько таблиц вида id и набор полей.
И одна таблица, в которую записываются id'хи из этих таблиц.
Делаю форму, в которой есть combobox'ы отображающие значения полей из той кучи таблиц.
После того как юзер выбирает какие-то варианты в combobox'ах и жмёт кнопку Ok.
В сводную таблицу должны прописываться id'хи из соотв. таблиц.

Вопрос в том как это правильно кодить?
Нужно ли для каждого combobox'а делать отдельную модель?
Как потом в сводную таблицу писать нужные значения.

Если бы кто-нибудь показать взрослую апликуху, которая работает с базой вообще было бы идеально.


Название: Re: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: GreatSnake от Май 17, 2012, 16:10
Код
C++ (Qt)
query = QSqlQuery(QSqlDatabase::database(connectionName));
query.exec("SELECT  id, language FROM langs ORDER BY id");
 
while (query.next()) {
       ui->langComboBox->addItem(query.value(1).toString(), query.value(0));
}

id для выбранного language получаешь через QComboBox::itemData().


Название: Re: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: smartchecker от Май 18, 2012, 09:39
Пример можно?


Название: Re: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: smartchecker от Май 18, 2012, 09:46
Правильно ли я понимаю что будет так:
Код
C++ (Qt)
qDebug() << ui->langComboBox->itemData(ui->langComboBox->currentIndex()).toInt();
 


Название: Re: Заполнение combobox'а из таблицы. Как правильно?
Отправлено: GreatSnake от Май 18, 2012, 11:12
Правильно ли я понимаю что будет так:
Да.