у меня возникли трудности с реализацией пользовательского рендеринга виджета в 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.