将PyQT表项从QComboBox更改为QTableWidgetItem

时间:2016-09-15 06:21:49

标签: python python-2.7 pyqt pyqt4

在我的PyQT窗口中,我在一列中有一个包含QComboBox的表。如何将QComboBox稍后更改为常规QTableWidgetItem以显示某些文字?

我尝试了以下操作,但QComboBox未被QTableWidgetItem中的文字取代。

myTable= QTableWidget()
myTable.setRowCount(6)
myTable.setColumnCount(2)
myTable.setHorizontalHeaderLabels(QString("Name;Age;").split(";"))
myTable.horizontalHeader().setResizeMode(QHeaderView.Stretch)


# Populate with QComboBox in column 1
for i, name in enumerate(nameList):
    myTable.setItem(i, 0, QTableWidgetItem(name ))

    ageCombo = QComboBox()
    for option in ageComboOptions:
        ageCombo.addItem(option)
    myTable.setCellWidget(i, 1, ageCombo)

# Change column 1 to QTableWidgetItem
for i, name in enumerate(nameList):
    myTable.setItem(i, 1, QTableWidgetItem(name))

1 个答案:

答案 0 :(得分:3)

简短的回答是,如果你只是removeCellWidget,你就会得到你想要的东西。下面的示例代码。

但更详细:

"项目"由setItem和" Widget"设置由setCellWidget设置的不同 - 它们扮演不同的角色。该项包含单元格的数据:在模型中的模型视图体系结构中。小部件正在显示:它在视图中。因此,当您设置单元格小部件时,您可能仍然希望它使用其后面的模型中的项目。但是,QTableWidget为QT中使用的完整模型视图架构提供了简化的API(例如,请参阅QTableViewQAbstractitemModel)。它提供了自己的默认模型,您可以通过每个单元格的项目访问它。然后,当您替换单元格上的小部件时,它根本不需要任何项目,只允许您直接控制小部件。删除小部件,然后返回使用该项目。

这是一个有效的例子:

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUI()

    def initUI(self):

        self.myTable= QtGui.QTableWidget()
        self.myTable.setRowCount(1)
        self.myTable.setColumnCount(2)

        item1 = QtGui.QTableWidgetItem("a")
        self.myTable.setItem(0, 0, item1)
        item2 = QtGui.QTableWidgetItem("b")
        self.myTable.setItem(0, 1, item2)

        self.setCentralWidget(self.myTable)

        menubar = QtGui.QMenuBar(self)
        self.setMenuBar(menubar)
        menu = QtGui.QMenu(menubar)
        menu.setTitle("Test")
        action = QtGui.QAction(self)
        action.setText("Test 1")
        action.triggered.connect(self.test1)
        menu.addAction(action)
        action = QtGui.QAction(self)
        action.setText("Test 2")
        action.triggered.connect(self.test2)
        menu.addAction(action)
        menubar.addAction(menu.menuAction())


        self.show()

    def test1(self):
        self.myTable.removeCellWidget(0, 1)

    def test2(self):
        combo = QtGui.QComboBox()
        combo.addItem("c")
        combo.addItem("d")
        self.myTable.setCellWidget(0, 1, combo)


def main():
    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()