2010-05-04 6 views
4

J'implémente QAbstractTableModel et je voudrais insérer QPushButton dans la dernière colonne de chaque ligne. Lorsque les utilisateurs cliquent sur ce bouton, une nouvelle fenêtre s'affiche avec plus d'informations sur cette ligne.Comment insérer QPushButton dans TableView?

Avez-vous une idée de comment insérer le bouton? Je connais le système de délégation mais tous les exemples ne concernent que "comment éditer les couleurs avec la combo" ...

Répondre

3

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:

  1. Ce sera seulement un dessin d'un bouton-poussoir
  2. 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
  3. 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.

+0

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. –

+0

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. –

+0

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'? –

0

Vous pouvez utiliser setCellWidget(row,column,QWidget*) pour définir un widget dans une cellule spécifique.

+1

Cela semble être une méthode de QTableWidget non QTableView. – Swoogan

5

Vous pouvez utiliser

QPushButton* viewButton = new QPushButton("View");  
tableView->setIndexWidget(model->index(counter,2), viewButton);