2016-06-10 45 views
0

我做了一个QTreeWidget,我有comboBox作为QTreeWidgetItem。如何正确连接信号,以便每个comboxBox索引都会更改treeWidget中的同一行?PyQt连接信号从QComboBox里面的QTreeWidgetItem

exampleWindow

说,如果我改变从添加行itemB行动删除。它会改变itemB的backgroundColor至somethingelse ...

data = { 'GroupA': [ 
        {'itemA': {'action' : 'Add'}}, 
        {'itemB':{'action' : 'Updates'}}, 
        ], 
     'GroupB': [ 
        {'someOtherItemA': {'action' : 'Updates'}}, 
        {'someOtherItemA':{'action' : 'Add'}}, 
        ] 

     } 


class Window(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(Window, self).__init__(parent) 

     self.treeWidget=QtGui.QTreeWidget(self) 
     self.treeWidget.setGeometry(QtCore.QRect(50,20,450,240)) 

     self.header=QtGui.QTreeWidgetItem(["Item","Action"]) 
     self.treeWidget.setHeaderItem(self.header) 

     for group in data: 
      groupItem=QtGui.QTreeWidgetItem(self.treeWidget) 
      groupItem.setText(0,group) 
      groupItem.setFlags(QtCore.Qt.ItemIsEnabled) 

      for itemDict in data[group]: 
       for item in itemDict: 

        itemWidget=QtGui.QTreeWidgetItem(groupItem, [item]) 
        itemWidget.setText(0, item) 

        action = itemDict[item]['action'] 
        self.action = self._actionCombo() 
        self.treeWidget.setItemWidget(itemWidget, 1, self.actionCombo) 
        slotLambda = lambda: self.actionChanged(itemWidget) 
        self.action.currentIndexChanged.connect(slotLambda) 

     self.treeWidget.expandAll() 


    @QtCore.pyqtSlot(QtGui.QTreeWidgetItem) 
    def actionChanged(self, treeWidgetItem): 
     treeWidgetItem.setBackgroundColor(0, QtGui.QColor(0,0,0)) 

    def _actionCombo(self): 

     self.actionCombo = QtGui.QComboBox() 
     actionLists = ['Add', 'Updates', 'Keep', 'Remove'] 
     for actionItem in actionLists: 
      self.actionCombo.addItem(actionItem) 

     return self.actionCombo 

    def report(self): 
     #construct the data back in a dictionary 

     newData = {} 
     return newData 

另一个问题是如何构建我基于该QtreeWidget数据字典做?这样我就可以得到用户为每个项目的操作选择的内容,并像以下字典一样报告回来?

dataReportBack = { 'GroupA': [ 
         {'itemA': {'action' : 'Add'}}, 
         {'itemB':{'action' : 'Updates'}}, 
         ], 
      'GroupB': [ 
         {'someOtherItemA': {'action' : 'Updates'}}, 
         {'someOtherItemA':{'action' : 'Add'}}, 
         ] 

      } 

回答

1

它,你是如何创建每个组合框的真不明白(是self.actionself.actionCombo被每次设定一个新的组合框?)。

假设你刚刚创建的每个项目控件新QComboBox,最简单的方法是只通过组合框和itemwidget到信号处理程序。

class Widget(...) 
    ... 

    def func(self):   
     ... 
     for item in itemDict: 
      itemWidget = QtGui.QTreeWidgetItem(groupItem, [item]) 
      itemWidget.setText(0, item) 
      # I'm guessing this creates a new QComboBox 
      actionCombo = self._actionCombo() 
      self.treeWidget.setItemWidget(itemWidget, 1, actionCombo) 
      actionCombo.currentIndexChanged.connect(lambda: self.on_actionComboChanged(actionCombo, itemWidget) 

    def on_actionComboChanged(self, actionCombo, itemWidget) 
     if actionCombo.currentText() == 'Add': 
      color = QtGui.QColor(QtCore.Qt.green) 
     else: 
      color = QtGui.QColor(QtCore.Qt.red) 
     itemWidget.setData(QtCore.Qt.BackgroundRole, QtGui.QBrush(color))