Russian Qt Forum
Июнь 16, 2024, 02:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QComboBox+QDataWidgetMapper  (Прочитано 11029 раз)
nata267
Гость
« : Май 18, 2010, 15:08 »

Здесь уже обсуждалась эта тема, может быть даже неоднократно, но все равно хочу поделиться опытом.....

вот делегат:

Код:
class QTaskTypesDelegate : public QItemDelegate
{

    public:
        QTaskTypesDelegate(QObject *parent)
                : QItemDelegate(parent)
        {

        }

        void setEditorData(QWidget *editor,
                        const QModelIndex &index) const
        {
            if(index.column()==8) {
                QVariant value = index.model()->data(
                     index, Qt::EditRole);

                 QComboBox *combo = static_cast<QComboBox*>(editor);
                 combo->setCurrentIndex(combo->findData(value));
             } else {
                 QItemDelegate::setEditorData(editor, index);
             }
        }

        void setModelData(QWidget *editor,
                        QAbstractItemModel *model,
                        const QModelIndex &index) const
        {
            if(index.column()==8) {
                QComboBox *combo = static_cast<QComboBox*>(editor);
                QVariant value = combo->itemData(combo->currentIndex());
                model->setData(index, value);
            } else {
                QItemDelegate::setModelData(editor,model,index);
            }
        }

};

Вот так заполняю комбобокс:

Код:
QSqlQueryModel *taskTypeModel = new QSqlQueryModel();
taskTypeModel->setQuery("SELECT * FROM task_types");

for(int row=0; row<taskTypeModel->rowCount(); ++row) {
        QSqlRecord record = taskTypeModel->record(row);
        comboBoxType->addItem(record.value("name").toString(), record.value("id"));
}

вызываю методы мэппера:

Код:
mapper->setItemDelegate(new QTaskTypesDelegate(this));
mapper->addMapping(comboBoxType,8);


Если есть лучше вариант - пишите....

Записан
crossly
Гость
« Ответ #1 : Май 18, 2010, 15:11 »

как минимум...
Код:
void QComboBox::setModel ( QAbstractItemModel * model )
Записан
nata267
Гость
« Ответ #2 : Май 18, 2010, 15:16 »

crossy, если я вас правильно поняла, то вы предлагаете упростить заполнение комбо, но как передать таким образом идшники в качестве данных, так и не смогла с этим разобраться
Записан
crossly
Гость
« Ответ #3 : Май 18, 2010, 15:21 »

findText(...) и вообще не пойму для чего этот костыль если есть QSqlRelationalTableModel??
Записан
nata267
Гость
« Ответ #4 : Май 18, 2010, 15:23 »

я не использую QSqlRelationalTableModel, так как согласна с вами это костыль, использую только QSqlQueryModel, вы наверно заметили что я использую свой делегат...
« Последнее редактирование: Май 18, 2010, 15:30 от nata267 » Записан
nata267
Гость
« Ответ #5 : Май 18, 2010, 15:25 »

причем здесь findText, если мне потом нужны идшники, ладно, вы наверно не в курсе проблемы
Записан
crossly
Гость
« Ответ #6 : Май 19, 2010, 08:45 »

лан.... давай тогда разберемся.... в каком месте тебе нужны id... и в чем проблема при использовании модели??
Записан
nata267
Гость
« Ответ #7 : Май 19, 2010, 15:07 »

вот это
Код:
QSqlQueryModel *taskTypeModel = new QSqlQueryModel();
taskTypeModel->setQuery("SELECT * FROM task_types");

for(int row=0; row<taskTypeModel->rowCount(); ++row) {
        QSqlRecord record = taskTypeModel->record(row);
        comboBoxType->addItem(record.value("name").toString(), record.value("id"));
}

заменить на

Код:
QSqlQueryModel *taskTypeModel = new QSqlQueryModel();
taskTypeModel->setQuery("SELECT id,name FROM task_types");

comboBoxType->setModel(taskTypeModel);
comboBoxType->setModelColumn(1);

а id передать туда, чтобы их можно было выбирать combo->itemData(combo->currentIndex());
Записан
nata267
Гость
« Ответ #8 : Май 19, 2010, 15:10 »

проблемы нет, яы же написала что хочу поделиться опытом, но если есть варианты сделать лучше, пишите...
Записан
crossly
Гость
« Ответ #9 : Май 19, 2010, 15:36 »

id можно получить примерно так
Код:
model->data(model->index(combo->currentIndex(),0)).toInt()
Записан
nata267
Гость
« Ответ #10 : Май 21, 2010, 10:13 »

спасибо, надо проверить
Записан
crossly
Гость
« Ответ #11 : Май 21, 2010, 10:16 »

а вообще посмотрите реализацию QSqlRelationalTbaleModel....
Записан
nata267
Гость
« Ответ #12 : Май 31, 2010, 10:36 »

а можно если я использую QSqlRelationalTbaleModel не имя таблицы задавать, а какойнибудь произвольный запрос, что если мне нужны данные из нескольких таблиц объединенных например inner join ом в запросе я тогда использую QSqlQueryModel и его метод setQuery(запрос). А как мне это реализовать в QSqlRelationalTbaleModel. А и ещё... Я могу закрыть для редактирования какие то поля и сделать свое собственное редактирование данных переопределив методы setData и flags,  могу ли я делать это в QSqlRelationalTbaleModel. Я думаю чем законченнее класс тем он дает меньше возможностей, а чем абстрактнее тем возможностей больше, но в меру конечно)) И я считаю что QSqlQueryModel дает больше возможностей или я нне права.
Записан
MoPDoBoPoT
Гость
« Ответ #13 : Май 31, 2010, 13:21 »

а можно если я использую QSqlRelationalTbaleModel не имя таблицы задавать, а какойнибудь произвольный запрос, что если мне нужны данные из нескольких таблиц объединенных например inner join ом в запросе я тогда использую QSqlQueryModel и его метод setQuery(запрос). А как мне это реализовать в QSqlRelationalTbaleModel.
Можно в БД создать представление (CREATE VIEW ...) и задавать его имя в QSqlRelationalTableModel как обычную таблицу, иначе, как ты и делал, использовать QSqlQueryModel.
...переопределив методы setData и flags,  могу ли я делать это в QSqlRelationalTbaleModel
Эти методы расположены в public секции, поэтому ты можешь их переопределить в наследнике QSqlRelationalTableModel.
Записан
crossly
Гость
« Ответ #14 : Май 31, 2010, 14:00 »

setQuery так же можно использовать в  наследнике... и кстати я не советовал использовать relatinaltablemodel.... и лишь предлагал подсмотреть реализацию нужного вам функционала...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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