2009-11-20 9 views
4

Je voudrais faire apparaître un menu contextuel lorsque l'utilisateur clique sur un objet dans QTreeWidgetItem. Je pense à attraper le signal contextMenuRequested de QWidget, puis en récupérant l'index de la vue en utilisant itemAt. Mais cela ne semble pas très joli. Existe-t-il un moyen plus simple de pouvoir appeler un menu sur un élément dans une vue?Appel du menu contextuel dans QTreeWidget

Répondre

4

Écrivez votre propre coutume ItemDelegate et gérer l'événement, cliquez dans QAbstractItemDelegate::editorEvent. Vous pouvez récupérer les données dans la cellule à partir de QModelIndex. En C++, il ressemblerait à ceci:

class ItemDelegate: public QItemDelegate 
{ 
public: 
    ItemDelegate(ContextMenuHandler *const contextMenu, QObject *const parent) 
     : QItemDelegate(parent) 
     , m_contexMenu(contextMenu) 
    { 
    } 

    bool editorEvent( 
      QEvent * event, 
      QAbstractItemModel * model, 
      const QStyleOptionViewItem & option, 
      const QModelIndex & index) 
    { 
     if((event->type()==QEvent::MouseButtonPress) && index.isValid()) 
     { 
      QMouseEvent *const mouseEvent = qobject_cast<QMouseEvent>(event); 
      if(mouseEvent && (mouseEvent->button()==Qt::RightButton)) 
      { 
       return m_contexMenu->showContextMenu(mouseEvent->pos(), index); 
      } 
     } 
    } 
    ContextMenuHandler *const m_contextMenu; 
}; 

treeWidget->setItemDelegate(new ItemDelegate(contextMenuHandler,treeWidget)); 
+0

Merci, cela semble assez joli :-) Événement géré directement dans l'élément. – gruszczy

+0

qu'est ce que ContextMenuHandler? pourquoi est-ce nécessaire? – Prady

0

J'utilise quelque chose comme ceci:

self.widget_layers.setContextMenuPolicy(Qt.ActionsContextMenu) 
removeLayerAction = QAction("Remove selected layer", self) 
self.connect(removeLayerAction, SIGNAL('triggered()'), self.layers_widget_controller.remove_selected_layer) 

et vérifiez quel élément a déclenché le signal par:

selected_item = self.main_window.widget_layers.selectedItems()[0] 
0

Ce que je l'ai fait avec le nouveau style signal/fente:

self.treeMenu = QMenu() 
self.treeAction = QAction('print', self.treeMenu) 
self.treeAction.triggered.connect(self.printTreeItem) 
self.treeWidget.addAction(self.treeAction) 

@pyqtSlot()  
def printTreeItem(self): 
    print self.treeWidget.currentItem().text(0) 

Cela ouvrira un menu lorsque vous faites un clic droit dans le votre treeWidget. Et si vous cliquez sur 'imprimer', dans votre console, il imprimera l'élément qui a le focus actuel, c'est celui sur lequel vous avez cliqué à droite.

Note: l'article actuel n'est pas nécessaire l'article sélectionné, l'article sélectionné est celui sur lequel vous avez cliqué le plus récemment.