Наиболее, на мой взгляд, подходит для таких целей QtGui.QItemDelegate.
Вот пример:
#!/usr/bin/env python2
# -*- coding: iso-8859-5 -*-
from PyQt4 import QtGui,QtCore
#-------------------
class ComboBoxDelegate(QtGui.QItemDelegate):
def __init__(self, parent):
super(ComboBoxDelegate, self).__init__(parent)
def createEditor(self, parent, option, index):
editor = QtGui.QComboBox(parent)
editor.addItems(["car1", "car2", "car3", "car4"]) #Загрузить в список свои данные
editor.activated.connect(self.emitCommitData)
return editor
def setEditorData(self, editor, index):
pos = 0
editor.setCurrentIndex(pos)
def setModelData(self, editor, model, index):
print "currentText=", editor.currentText()
model.setData(index, editor.currentText())
def emitCommitData(self):
pass #сделать то, что требуется, например где-то ещё сохранить
#---------
class TableW(QtGui.QWidget):
def __init__(self, parent=None):
super(TableW, self).__init__(parent, QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowSystemMenuHint)
items = ["car1", "car2", "car3", "car4"]
self.itemsTable = QtGui.QTableWidget(len(items), 2)
# self.itemsTable.setItemDelegate(ComboBoxDelegate(self)) #for all cells
# self.itemsTable.setItemDelegateForRow(0, ComboBoxDelegate(self)) #for row number 0
self.itemsTable.setItemDelegateForColumn(0, ComboBoxDelegate(self)) #for column number 0
for row, item in enumerate(items):
name = QtGui.QTableWidgetItem(item)
# name.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable)
self.itemsTable.setItem(row, 0, name)
self.itemsTable.setItem(row, 1,QtGui.QTableWidgetItem(str(row)))
layout = QtGui.QVBoxLayout()
layout.addWidget(self.itemsTable)
self.setLayout(layout)
#------------
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
table = TableW()
table.show()
res = app.exec_()
table = 0
sys.exit(res)