2012-12-01 2 views
4

QTreeWidget에서 itemChecked 및 itemUnchecked 신호는 어디에 있습니까?PyQt4에서 QTreeWidget에 대한 itemChecked 및 itemUnchecked 신호를 구현하는 방법은 무엇입니까?

self.treeWidget.itemClicked.connect (self.handle) 

def handle (item, column): 
    print 'emitted!', item.text(column) 
    if item.checkState(column) == QtCore.Qt.Checked: 
     # there are a lot of my functions inside which work with item data 
     self.handleChecked(item, column) 
    elif item.checkState(column) == QtCore.Qt.Unchecked: 
     self.handleUnchecked(item, column) 

을하지만 itemClicked이 경우 정말 많이 방출하기 때문에 그것은 나에 대한 나쁜 해결책 : 현재의 순간

Qt Signals: (quote from PyQt4 QTreeWidget documentation page) 

void currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *) 
void itemActivated (QTreeWidgetItem *,int) 
void itemChanged (QTreeWidgetItem *,int) 
void itemClicked (QTreeWidgetItem *,int) 
void itemCollapsed (QTreeWidgetItem *) 
void itemDoubleClicked (QTreeWidgetItem *,int) 
void itemEntered (QTreeWidgetItem *,int) 
void itemExpanded (QTreeWidgetItem *) 
void itemPressed (QTreeWidgetItem *,int) 
void itemSelectionChanged() 

나는 이런 식으로 해결. 그것은 절대적으로 불필요한 항목 텍스트의 왼쪽/오른쪽 마우스 클릭의 경우에 발생합니다 (self.handleChecked 내에서 무거운 기능을 가지고 있으며 상황에 맞는 메뉴 열기에서 불필요한 호출은 매우 형편 없음).

글쎄, 나는 또한 itemChanged를 사용하려고 :

self.treeWidget.itemChanged.connect (self.handle) 

하지만 이런 식으로 상황이 더 악화입니다! self.handle 함수는 self.handleChecked 내 함수가 항목 데이터를 변경하고이 신호가 반복해서 방출되기 때문에 스스로를 무한대 이상으로 재귀 적으로 호출합니다. 또한 항목 체크 박스 토글 링에서만 발생하는 신호가 필요합니다.

누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 핸들러가 완료 될 때까지

+0

은'itemChanged' 신호를 사용할 수있는 권리 하나는 확실히이다. "self.handle calls recursively"의 의미는 무엇입니까? 정확히 무엇이 그것에 대해 "받아 들일 수없는"것입니까? – ekhumoro

+0

@ekhumoro, 게시물을 업데이트했습니다. –

+0

확인 된 상태가 변경 될 때만 신호를 방출 할 수있는 해결책으로 내 대답을 업데이트했습니다. 신호를 차단하는 것보다 더 나은 방법을 찾을 수 있습니다. – ekhumoro

답변

10

하면 itemChanged 신호를 사용하는 경우, 일시적으로 blocking signals을 시도 재귀 문제를 방지하려면

def handle(self, item, column): 
    self.treeWidget.blockSignals(True) 
    if item.checkState(column) == QtCore.Qt.Checked: 
     self.handleChecked(item, column) 
    elif item.checkState(column) == QtCore.Qt.Unchecked: 
     self.handleUnchecked(item, column) 
    self.treeWidget.blockSignals(False) 

UPDATE

만 신호를 방출에 대해 질문 질문의 다른 부분 항목이 선택되면. 이 작업을 수행하는

한 가지 방법은 QTreeWidgetItem를 서브 클래스 화해, 재 구현하는 것이 setData 기능입니다 :

class TreeWidgetItem(QtGui.QTreeWidgetItem): 
    def setData(self, column, role, value): 
     state = self.checkState(column) 
     QtGui.QTreeWidgetItem.setData(self, column, role, value) 
     if (role == QtCore.Qt.CheckStateRole and 
      state != self.checkState(column)): 
      treewidget = self.treeWidget() 
      if treewidget is not None: 
       treewidget.itemChecked.emit(self, column) 

class Window(QtGui.QTreeWidget): 
    itemChecked = QtCore.pyqtSignal(object, int) 

    def __init__(self, rows, columns): 
     QtGui.QTreeWidget.__init__(self) 
     self.itemChecked.connect(self.handleItemChecked) 

    def handleItemChecked(self, item, column): 
     print 'ItemChecked', int(item.checkState(column)) 
+0

누군가 이것을 C++로 번역 할 수 있습니까? – taz

+2

@ taz. 새로운 질문을 게시해야합니다. 아무도 귀하의 의견을 볼 수 없습니다. – ekhumoro

관련 문제