L'architecture de vue de modèle n'est pas faite pour insérer des widgets dans des cellules différentes, mais vous pouvez dessiner la poussée bouton dans la cellule.
Les différences sont les suivantes:
- Ce sera seulement un dessin d'un bouton-poussoir
- Sans travail supplémentaire (peut-être tout à fait un peu de travail supplémentaire) sur le bouton ne sera pas mis en évidence sur mouseover
- en conséquence de 1 ci-dessus, vous ne pouvez pas utiliser des signaux et slots
cela dit, voici comment faire:
Sous-classe QAbstractItemDelegate (ou QStyledItemDelegate) et implémentez la méthode paint()
. Pour dessiner le contrôle de bouton-poussoir (ou tout autre contrôle pour cette question), vous aurez besoin d'utiliser un style ou la méthode QStylePainter::drawControl()
:
class PushButtonDelegate : public QAbstractItemDelegate
{
// TODO: handle public, private, etc.
QAbstractItemView *view;
public PushButtonDelegate(QAbstractItemView* view)
{
this->view = view;
}
void PushButtonDelegate::paint(
QPainter* painter,
const QStyleOptionViewItem & option,
const QModelIndex & index
) const
{
// assuming this delegate is only registered for the correct column/row
QStylePainter stylePainter(view);
// OR: stylePainter(painter->device)
stylePainter->drawControl(QStyle::CE_PushButton, option);
// OR: view->style()->drawControl(QStyle::CE_PushButton, option, painter, view);
// OR: QApplication::style()->drawControl(/* params as above */);
}
}
Depuis le délégué vous permet de rester dans le domaine modèle-vue, utiliser les signaux de vues à propos de la sélection et des modifications pour faire apparaître votre fenêtre d'information.
Votés cette place, mais voulait ajouter: Vous pouvez obtenir le bouton pour être réellement un bouton plutôt qu'un dessin d'un bouton, mais il est sans doute pas la peine à cause de la surcharge. Vous devez créer un éditeur personnalisé et laisser la cellule passer en mode édition avec la souris. –
Une pensée intéressante. C'est peut-être possible, mais je ne sais pas exactement comment je mettrais cela en place. Les appels 'setEditorData()' se produisent dans les entrailles de 'QAbstractItemView', donc il semble que ce serait beaucoup de travail, en supposant que c'est possible. Sur une note connexe, il est en fait assez facile d'accrocher dans le vol stationnaire et faire une repeindre pour montrer un indice visible. –
Qu'est-ce qui va changer dans votre code si l'on veut dessiner un widget, au lieu d'un simple bouton? Que fait ce 'QStyle :: CE_PushButton'? –