Russian Qt Forum

Qt => Model-View (MV) => Тема начата: UVV от Август 31, 2007, 06:01



Название: Ещё вопрос по QItemDelegate
Отправлено: UVV от Август 31, 2007, 06:01
Нужно сделать так, чтобы при редактировании данных в QTableView в одной из колонок был ComboBox со списком возможных значений. Значение составляется из 5 разных полей БД. Я реализовал это дело следующим образом:
Код:
query.exec("select id, surname, name, patronymic, field1, field2...");
while (query.next())
{
const QString key =
query.value(1).toString() + " " +
query.value(2).toString() + " " +
query.value(3).toString() + " " +
query.value(4).toString() + " " +
query.value(5).toString();
map[key] = query.value(0).toInt();
}

myTableView->setItemDelegateForColumn(column_number, new MyDelegate(map));
Далее сам код делегата:
Код:
void MyDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int i = index.model()->data(index, Qt::DisplayRole).toInt();
drawDisplay(painter, option, option.rect, m_map.key(i));
drawFocus(painter, option, option.rect);
}

QWidget *MyDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QComboBox *combobox = new QComboBox(parent);
QMapIterator<QString, int> i(m_map);
combobox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
while (i.hasNext())
{
i.next();
combobox->addItem(i.key(), i.value());
}
combobox->installEventFilter(const_cast<DonorDelegate*>(this));
return combobox;
}

void MyDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
int i = index.model()->data(index, Qt::DisplayRole).toInt();
QComboBox *combobox = qobject_cast<QComboBox*>(editor);
combobox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
combobox->setCurrentIndex(combobox->findData(i));
}

void DonorDelegate::setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox *combobox = qobject_cast<QComboBox*>(editor);
combobox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
QVariant i = combobox->itemData(combobox->currentIndex());
model->setData(index, i);
}

Вроде бы всё работает, однако появились следующие неудобства, которые я пока не знаю как решить:
  • В коде используется функция myTableView->resizeColumnsToContents(); После неё ширина колонки становится равной 4-5 символов, т.е. она подбирается не по тексту, а по id. Как нужно модифицировать делегат, чтобы был правильный подбор ширины?
  • Аналогично первому вопросу, используется функция TableView->setSortingEnabled(true).
    Сортировка также производится не по тексту, а по значению, т.е. по id.


Название: Re: Ещё вопрос по QItemDelegate
Отправлено: denka от Август 31, 2007, 07:14
1. У тя переопределен QItemDelgate::sizeHint?
2. Id присутсвует в каком-то столбце? Если да то используеш setSort или sort.
Если нет создаеш свою QSortFilterProxyModel.


Название: Re: Ещё вопрос по QItemDelegate
Отправлено: UVV от Август 31, 2007, 09:56
1. У тя переопределен QItemDelgate::sizeHint?
Нет, я его не переопределял.
Нужно самому задать максимальный размер?
2. Id присутсвует в каком-то столбце? Если да то используеш setSort или sort.
Если нет создаеш свою QSortFilterProxyModel.
Забыл сказать. В QTableView отображён QSqlRelationalTableModel. В предыдущем примере я показал, что в id (query.value(0).toInt()) находится в самом Combobox'e.


Название: Re: Ещё вопрос по QItemDelegate
Отправлено: denka от Август 31, 2007, 10:12
1. Переопредели sizeHint и для нужного индекса возвращай нужный размер
2. То есть как я понял у тя id это индекс Combobox'a который храниться в QSqlRelationalTableModel, тогда надо использовать setSort или sort этого класса. т.е.:
Код:
model->sort( колонка_с_id, Qt::AscendingOrder );


Название: Re: Ещё вопрос по QItemDelegate
Отправлено: UVV от Сентябрь 02, 2007, 09:30
1. Переопредели sizeHint и для нужного индекса возвращай нужный размер
Я что-то не понял. Для одной модели данных нужно использовать одни делегат-класс на все столбцы сразу или на каждый столбец по делегату?
2. То есть как я понял у тя id это индекс Combobox'a который храниться в QSqlRelationalTableModel, тогда надо использовать setSort или sort этого класса. т.е.:
Код:
model->sort( колонка_с_id, Qt::AscendingOrder );
Что-то я совсем запутался или просто не правильно объясняю:
Код:
combobox->addItem(i.key(), i.value());
i.key() - текстовое значение
i.value() - id
Если я использую setSortingEnabled, то как мне использовать просто sort?