QTableWidget 中的 PySide QComboBox (Python)

PySide QComboBox in QTableWidget (Python)

我有 table 5x3:第一列只是临时文本,第二列包含组合框,最后一列是组合框中选择的结果。
现在只需将结果设置到第 1 行,我需要为每个组合框将结果设置为行。(例如:如果更改第 4 行中的组合框,设置第 4 行中的项目等。)

我找到了这个 example,但我无法在我的脚本中实现。

import PySide.QtCore as QtCore
import PySide.QtGui as QtGui

class cBox( QtGui.QComboBox ):
    def __init__( self, *args, **kwargs ):
        super( cBox, self ).__init__( *args, **kwargs)


class TestTable( QtGui.QWidget ):
    def __init__( self, parent=None ):
        QtGui.QWidget.__init__( self, parent )

        self.setLayout( QtGui.QVBoxLayout() )
        self.resize( 600, 300 )

        self.myTable = QtGui.QTableWidget()
        self.myTable.setColumnCount( 3 )
        self.myTable.setRowCount( 5 )    

        self.setTable()  

        self.layout().addWidget(self.myTable)
        self.myTable.cellChanged.connect(self.update) 

    def setTable(self):

        for i in range( 0, self.myTable.rowCount() ):
            item = "row " + str(i)
            self.myTable.setItem(i, 0, QtGui.QTableWidgetItem(item))

            box = cBox()
            nameList = ("sss","aaa","qqq")
            box.addItems(nameList)

            self.myTable.setCellWidget( i,1,box)   
            box.currentIndexChanged.connect(self.tmp)

    def tmp(self,i):
        row = 1 # this I need change for actual row ,now just set to row 1 
        item = "item " + str(i)
        self.myTable.setItem(row, 2, QtGui.QTableWidgetItem(item)) #set item to 3 column by selected item form combo box


if __name__ == "__main__":

    tableView = TestTable()
    tableView.show()

这是我的解决方案:

from functools import partial

def setTable(self):
    for i in range( 0, self.myTable.rowCount() ):
        item = "row " + str(i)
        self.myTable.setItem(i, 0, QtGui.QTableWidgetItem(item))

        box = cBox()
        nameList = ("sss","aaa","qqq")
        box.addItems(nameList)

        self.myTable.setCellWidget(i,1,box)
        # here the 'i' will be the parameter rowIndex in the tmp function
        box.currentIndexChanged.connect(partial(self.tmp, i))

def tmp(self, rowIndex, comboBoxIndex):
    # this print statements are just for explanation
    print "current index of the combobox: " + str(comboBoxIndex)
    print "row index of where the combobox resides: " + str(rowIndex)
    item = "item " + str(comboBoxIndex)
    self.myTable.setItem(rowIndex, 2, QtGui.QTableWidgetItem(item))

partial 很有用,因为您可以将额外的参数传递给槽函数。 这是一个有用的link:http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot