Render QWidget no método paint () de QWidgetDelegate para um QListView
estou tendo dificuldades para implementar a renderização de widget personalizado em umQListView
. Atualmente, tenho umQListView
exibindo meu modelo personalizado chamadoPlayQueue
baseado emQAbstractListModel
.
Isto está funcionando bem com texto simples, mas agora eu gostaria de exibir um widget personalizado para cada elemento. Então eu subclassifiquei umQStyledItemDelegate
para implementar opaint
método como este:
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);
}
O plano de fundo da seleção é renderizado corretamente, mas nenhum widget é exibido. Eu tentei com simplesQPainter
comandos como nos exemplos Qt, e isso está funcionando bem:
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");
}
Então eu tentei algumas mudanças como:
ChangingQStyledItemDelegate
paraQItemDelegate
Addingpainter->save()
epainter->restore()
em torno da renderizaçãoConfigurando a geometria do widget para o tamanho disponívelMas estou um pouco preso agora, procurei por um tempo na internet, mas não consigo encontrar nenhum exemplo fazendo o que quero, todos falam sobre o widget de edição (que é muito mais fácil) ou o controle desenhado personalizado (predefinido como barras de progresso). Mas aqui eu realmente preciso de um widget personalizado que criei, contendo algum layout, etiquetas e pixmaps. Obrigado pela ajuda
Estou usando o Qt 4.7.3 para GCC no Ubuntu 11.04.