2009-11-20 4 views
4

사용자가 QTreeWidgetItem에서 객체를 클릭 할 때 메뉴를 팝업하고 싶습니다. QWidget에서 contextMenuRequested 신호를 받고 itemAt를 사용하여 뷰에서 인덱스를 검색하는 방법에 대해 설명합니다. 그러나 이것은 매우 예쁘지 않습니다. 보기 안의 항목에 대한 메뉴를 호출하는 더 쉬운 방법이 있습니까?QTreeWidget에서 컨텍스트 메뉴 호출

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

을에 의해 신호를 트리거하는 항목을 확인하십시오 :

답변

4

QAbstractItemDelegate::editorEvent에 클릭 이벤트를 처리합니다. QModelIndex에서 셀의 데이터를 검색 할 수 있습니다. C에서 는 같을 것이다 ++ : 당신은 당신의 treeWidget 내에서 마우스 오른쪽 단추로 클릭 할 때

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) 

이 메뉴를 열 것입니다 : 나는 새로운 신호/슬롯 스타일로 무슨 짓을

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

+0

ContextMenuHandler 란 무엇입니까? 왜 필요한가요? – Prady

0

나는 이런 식으로 뭔가를 사용하고 사용자 정의 ItemDelegate 쓰기

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

. 그리고 '인쇄'를 클릭하면 콘솔에서 현재 포커스가있는 항목을 인쇄 할 것입니다. 오른쪽 버튼으로 클릭 한 것입니다.

참고 : 현재 항목은 필수 항목이 아니며 선택한 항목은 가장 최근에 클릭 한 항목입니다.