У меня возникли проблемы с реализацией пользовательского рендеринга виджетов в QListView
.В настоящее время у меня есть QListView
, отображающий мою пользовательскую модель с именем PlayQueue
, основанную на QAbstractListModel
.
. Это нормально работает с простым текстом, но теперь я хотел бы отобразить собственный виджет для каждого элемента.Поэтому я вложил в класс QStyledItemDelegate
для реализации метода paint
следующим образом:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
QWidget *widget = new QPushButton("bonjour");
widget->render(painter);
}
Фон выделения правильно отображается, но виджет не отображается.Я попробовал с простыми QPainter
командами, как в примерах Qt, и это работает нормально:
void QueueableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
if (option.state & QStyle::State_Selected)
painter->setPen(option.palette.highlightedText().color());
painter->setFont(QFont("Arial", 10));
painter->drawText(option.rect, Qt::AlignCenter, "Custom drawing");
}
Так что я попробовал некоторые изменения, такие как:
- Изменение
QStyledItemDelegate
на QItemDelegate
- Добавление
painter->save()
и painter->restore()
при рендеринге - Установка геометрии виджета на доступный размер
Но я сейчас немного застрял,Я некоторое время искал в интернете, но не могу найти ни одного примера, делающего то, что я хочу, все они говорят о редактировании виджета (что намного проще) или о настраиваемом нарисованном элементе управления (предопределенные, такие как индикаторы выполнения).Но здесь мне действительно нужен собственный виджет, который я создал, содержащий некоторые макеты, метки и растровые изображения.Спасибо за вашу помощь!
Я использую Qt 4.7.3 для GCC в Ubuntu 11.04.