2009-11-20 64 views
4

我想彈出一個菜單,當用戶點擊QTreeWidgetItem中的一個對象時。我雖然關於從QWidget捕獲信號contextMenuRequested,然後使用itemAt從視圖中檢索索引。但這看起來不太漂亮。有沒有更簡單的方法可以調用視圖內某個項目的菜單?在QTreeWidget中調用上下文菜單

回答

4

寫自己的自定義ItemDelegate和QAbstractItemDelegate::editorEvent處理click事件。 您可以從QModelIndex中檢索單元格中的數據。 在C++中是這樣的:

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

謝謝,這看起來相當漂亮:-)事件直接在項目中處理。 – gruszczy 2009-11-23 09:59:10

+0

什麼是ContextMenuHandler?爲什麼需要? – Prady 2013-04-05 03:31:24

0

我使用的是這樣的:

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

,並檢查該項目由觸發信號:

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

我做了新的信號/插槽的風格是什麼:

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) 

這將打開一個菜單,當你在你的treeWidget中單擊鼠標右鍵。如果您點擊「打印」,在您的控制檯中它將打印出當前焦點的項目,這是您右鍵單擊的項目。

注意:當前項目不是必需的選定項目,所選項目是您最近點擊的項目。