在我的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))
答案 0 :(得分:3)
简短的回答是,如果你只是removeCellWidget
,你就会得到你想要的东西。下面的示例代码。
但更详细:
"项目"由setItem
和" Widget"设置由setCellWidget
设置的不同 - 它们扮演不同的角色。该项包含单元格的数据:在模型中的模型视图体系结构中。小部件正在显示:它在视图中。因此,当您设置单元格小部件时,您可能仍然希望它使用其后面的模型中的项目。但是,QTableWidget
为QT中使用的完整模型视图架构提供了简化的API(例如,请参阅QTableView
和QAbstractitemModel
)。它提供了自己的默认模型,您可以通过每个单元格的项目访问它。然后,当您替换单元格上的小部件时,它根本不需要任何项目,只允许您直接控制小部件。删除小部件,然后返回使用该项目。
这是一个有效的例子:
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()