ComboBoxDelegate берущий данные из базы данных MySQL

303
21 декабря 2016, 01:45

Есть две таблицы: Склад и Ингредиенты, связанные между собой внешним ключом по id. Организовал ComboBoxDelegate в QTableView. ComboBox берет данные из таблицы Склад столбца Вес. Но тут такой момент, что он отображает полностью весь столбец, а мне нужно, чтобы в каждой строке был выбор "веса" по соответственному айдишнику. На данный момент состояние кода следующее:

ComboBoxDelegate::ComboBoxDelegate(QObject *parent)
{
    DelegateModel = new QSqlQueryModel;
    DelegateModel->setQuery("SELECT weight FROM sklad, ingridient WHERE
    sklad.idsklad=ingridient.iding;");
}

QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const
QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{
    QComboBox *editor = new QComboBox(parent);
    editor->setModel(DelegateModel);
    return editor;
}

Подскажите кто чем может, а то уже моск сломал как это сделать.

Answer 1
QWidget *ComboBoxDelegate::createEditor(QWidget *parent
    , const QStyleOptionViewItem &option
    , const QModelIndex &index) const {
    // Индекс колонки с идентификаторами ингредиентов.
    const int iding_col = 0;
    const QVariant iding
        = index.model()->data(index.model()
            ->index(index.row(),iding_col));
    if(iding.isValid() == false)
        return Q_NULLPTR;
    QSqlQuery query;
    query.prepare(
        "SELECT `weight` FROM `sklad`" \
        " WHERE `idsklad` = :idsklad");
    query.bindValue(":idsklad", iding);
    if(query.exec() == false)
        return Q_NULLPTR;
    QComboBox *editor = new QComboBox(parent);
    // QStyleOptionViewItem содержит множество полезных вещей
    // для построения корректно выглядящего виджета редактора.
    editor->setGeometry(option.rect);
    // Каждый раз при создании виджета редактора
    // должен создаваться и новый инстанс модели,
    // поскольку выборка данных различна для каждой из строк.
    // Установка же виджета редактора в качестве родителя модели
    // позволяет не заботиться о своевременном удалении последней.
    QSqlQueryModel *model = new QSqlQueryModel(editor);
    model->setQuery(query);
    editor->setModel(model);
    return editor;
}
Answer 2

Подскажите кто чем может, а то уже моск сломал как это сделать

Надо править запрос:

SELECT 
  weight 
FROM 
  sklad, 
  ingridient 
WHERE
  sklad.idsklad=ingridient.iding 
  AND
  ingridient.iding = число

А "число" вычислять по QModelIndex. Я бы в эту сторону копал.

READ ALSO
SQL to json converting

SQL to json converting

У меня есть table на котором есть большая информация, мне нужно написать SELECT * FROM table, так чтобы SELECT возвращал меня информацию на JSON формате, например...

312
Как достать переменные из URL?

Как достать переменные из URL?

Добрый деньПишу интернет магазин, по одному курсу, который нашел на просторах интернета

277
Как при помощи php внести в БД MySQL данные о времени из формы?

Как при помощи php внести в БД MySQL данные о времени из формы?

Суть такова: Есть форма на сайтеВ форме есть поля: время отхода ко сну время пробуждения Это поля формата hh:mm Нужно занести значение поляей...

284