Rendre QWidget dans paint() la méthode de QWidgetDelegate pour un QListView
je vais avoir des difficultés pour mettre en œuvre widget personnalisé rendu dans un QListView
.
J'ai actuellement un QListView
l'affichage de mon modèle personnalisé appelé PlayQueue
basé sur QAbstractListModel
.
Cela fonctionne bien avec un simple texte, mais maintenant je voudrais afficher un widget personnalisé pour chaque élément.
J'ai donc un sous-classé QStyledItemDelegate
pour mettre en œuvre les paint
méthode comme ceci:
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);
}
La sélection de l'arrière-plan est bien rendu, mais pas de widget est affiché. J'ai essayé avec de simples QPainter
des commandes comme dans les exemples de Qt, et cela fonctionne bien:
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");
}
J'ai donc essayé quelques modifications comme:
- Changer
QStyledItemDelegate
àQItemDelegate
- Ajoutant
painter->save()
etpainter->restore()
autour de rendu - Paramètre le widget de la géométrie de la taille
Mais je suis un peu coincé maintenant, j'ai cherché un moment sur l'internet, mais ne peut pas trouver n'importe quel exemple de faire ce que je veux, ils parlent tous de l'édition de widget (qui est beaucoup plus facile) ou personnalisés tirés de contrôle (prédéfinis, comme les barres de progression).
Mais ici, j'ai vraiment besoin d'un widget personnalisé que j'ai créé, contenant peu de mise en page, labels & images.
Merci pour votre aide!
Je suis en utilisant Qt 4.7.3 pour GCC sous Ubuntu 11.04.
OriginalL'auteur Adrien Jarthon | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Juste pour compléter le tableau: en outre, on peut trouver le code pour gérer le QWidget comme QListView élément à l'aide de délégués.
J'ai enfin trouvé comment le faire fonctionner au sein de la sous-classe de QStyledItemDelegate à l'aide de sa peinture(...) de la méthode.
Il semble plus efficace pour la performance que la solution précédente, mais cette déclaration de l'un a besoin de vérifier =) par l'enquête, ce qui ne setIndexWidget() avec les créé QWidget.
Donc finalement, voici le code:
.....
.....
painter->end();
j'ai crééQPoint mappedorigin = painter->deviceTransform().map(QPoint(option.rect.x(), option.rect.y()))
, puis transmis mappedorigin que le 2ème arg pour QWidget::render(). Ce ne serait probablement pas nécessaire si je l'avais créé le widget dans cette fonction, mais je l'ai créé dans le cadre de widget parent.C'est la seule chose que travailleur pour moi, merci. J'ai dû ajouter de la cartographie de l' @AndrewDomaszek
OriginalL'auteur Physt
Ok j'ai enfin compris comment faire ce que je voulais. Voici ce que j'ai fait:
QListView::setIndexWidget()
dans ledata()
méthode de mon modèle pour définir le widgetQListView::indexWidget()
Qt::SizeHintRole
rôle de retourner le widget taille du soupçonQt::DisplayRole
rôleDe cette façon, j'ai mes widgets personnalisés affichés dans la QListView, et qu'ils sont correctement chargement paresseux (c'est pourquoi j'ai utilisé le modèle/modèle d'affichage). Mais je ne vois pas comment je peux décharger lorsque pas être affiché, eh bien, c'est un autre problème.
Nop je n'ai pas 🙁
OriginalL'auteur Adrien Jarthon
Ici est un exemple pour vous.
Il semble que vous devez utiliser QStylePainter mais c'est juste pour le dessin comme je le comprends, il n'agit pas comme un vrai bouton.
OriginalL'auteur O.C.