Russian Qt Forum

Qt => Model-View (MV) => Тема начата: voral от Март 24, 2011, 01:18



Название: [Решено]QComboBox QStyledItemDelegate фоновое изобажение в ячейке
Отправлено: voral от Март 24, 2011, 01:18
Итак есть модель, есть QTableView. Одной из колонок назначен делегат комбо лист. Все Ок. Но.
В обычном режиме таблицы нет ни каких визуальных меток, что можно в ячейке открыть комбик.
Хотелось бы в ячейке с этим делегатом с правой стороны разместить изображение стрелочки вниз.

Сегодня перепробовал вроде разных идей. Но не фига не выходит.
Так например. Для QTableView задаю стиль:
Код:
this->setStyleSheet("QTreeView::item::last{background-image:url(\":/res/arrow.png\");background-position:right center; background-repeat:no-repeat;}");

Изображение располагается там где надо, но фон становится всегда белым. Т.е. в этой ячейке пропадает и черезстрочность и фон пи активности стоки.

Второй вариант. В класс делегата:
Код:
void VComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
this->parent()->setObjectName("");
QComboBox *comboBox = static_cast<QComboBox*>(editor);
model->setData(index, comboBox->currentText(), Qt::EditRole);
model->setData(index,QImage(":/res/arrow..png"),Qt::DecorationRole);

}
Иконка появляется. Но только после редактирования и с лева от содержимого.

Подскажите направление/решение проблемы. Может я вообще не стой стороны захожу.


Название: Re: QStandardItemModel+QTableView+QComboBox (delegat) фоновое изобажение в ячейке
Отправлено: CL0NE от Март 24, 2011, 02:17
Я бы использовал paint event делегата


Название: Re: QStandardItemModel+QTableView+QComboBox (delegat) фоновое изобажение в ячейке
Отправлено: voral от Март 24, 2011, 02:30
Я бы использовал paint event делегата
вот сейчас сижу переопределил метод Paint у делегата.... вообще ни чего не получается - разве что цвет текста сумел поменять (но мне это не надо), но я ни когда еще с паинтом и прочей компанией для рисования не пользовался...... :(
Наверное надо спать идти.......


Название: Re: QStandardItemModel+QTableView+QComboBox (delegat) фоновое изобажение в ячейке
Отправлено: voral от Март 24, 2011, 11:17
Не выходит каменный цветочек. :(
Иконка рисуется. Но всегда в одной позиции относительно всего QTableView/QTreeView. Как найти позицию текущей строки?
painter->viewport().top(),painter->viewport().left(),index.row() - все дают 0
Код:
void VComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
  const QModelIndex &index) const
{
QImage img(":/trolltech/styles/commonstyle/images/viewlist-16.png");
painter->drawImage(10,10,img);
qDebug() << painter->viewport().top() << painter->viewport().left() << index.row() << index.data( Qt::DisplayRole ).toString();
QStyledItemDelegate::paint(painter, option, index);
}
upd дело сдвинулось
Код:
option.rect()


Название: Re: QStandardItemModel+QTableView+QComboBox (delegat) фоновое изобажение в ячейке
Отправлено: voral от Март 24, 2011, 11:41
Итак решено
Код:
void VComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
   const QModelIndex &index) const
{
QImage img(":/trolltech/styles/commonstyle/images/viewlist-16.png");
QStyledItemDelegate::paint(painter, option, index);
int left = option.rect.right() - img.size().width()-2;
int top = option.rect.top() + (option.rect.height() - img.size().height()) / 2;
painter->drawImage(left,top,img);
}
Осталось проработать следующий вопрос: в моем проекте колонка с этим делегатом имеет фиксированную ширину и я могу предусмотреть, чтобы иконка не "налезала" на содержимое ячейки. Но если ячейка будет резиновой как поступить красиво?