Russian Qt Forum
Ноябрь 23, 2024, 22:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]QComboBox QStyledItemDelegate фоновое изобажение в ячейке  (Прочитано 6202 раз)
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);

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

Подскажите направление/решение проблемы. Может я вообще не стой стороны захожу.
« Последнее редактирование: Март 24, 2011, 11:42 от voral » Записан
CL0NE
Гость
« Ответ #1 : Март 24, 2011, 02:17 »

Я бы использовал paint event делегата
Записан
voral
Гость
« Ответ #2 : Март 24, 2011, 02:30 »

Я бы использовал paint event делегата
вот сейчас сижу переопределил метод Paint у делегата.... вообще ни чего не получается - разве что цвет текста сумел поменять (но мне это не надо), но я ни когда еще с паинтом и прочей компанией для рисования не пользовался...... Грустный
Наверное надо спать идти.......
Записан
voral
Гость
« Ответ #3 : Март 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()
« Последнее редактирование: Март 24, 2011, 11:34 от voral » Записан
voral
Гость
« Ответ #4 : Март 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);
}
Осталось проработать следующий вопрос: в моем проекте колонка с этим делегатом имеет фиксированную ширину и я могу предусмотреть, чтобы иконка не "налезала" на содержимое ячейки. Но если ячейка будет резиновой как поступить красиво?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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