如何更改代码以在第0行中显示QComboBox,
2、4和6或任何任意行。(无论
QComboBox是否需要显示取决于第一个单元格的值
在reach行中。)
之所以出现只能看到QCOMBOX的问题,是因为您只创建了一个QCOMBOX,要解决这个问题,您必须为要在其中建立QCOMBOX的每个单元格创建一个QCOMBOX。
我需要使用什么样的方法来替换单元格内容
QComboBox选择?
您必须将适当的信号连接到模型的setData()方法,我们可以使用QModelIndex,但这很危险,因为当您删除、移动或插入项目时,它可能会发生更改,因此使用QPersistentModelIndex是适当的,在这种情况下,您必须使用信号currentIndexChanged
在本例中,我将使用
QModelIndex
:
def populate(self):
row = self.QSModel.rowCount()
for x in range(7):
self.QSModel.insertRow(row)
self.QSModel.setData(self.QSModel.index(row, 0), 'data')
self.QSModel.item(row, 0).setEditable(True)
self.QSModel.setData(self.QSModel.index(row, 1), 'data')
self.QSModel.item(row, 1).setEditable(True)
if x % 2 == 0:
index = self.tableView.model().index(row, 1)
cbDelegate = QComboBox()
pix = QPersistentModelIndex(index)
cbDelegate.currentIndexChanged[str].connect(lambda txt, pix=pix:self.tableView.model().setData(QModelIndex(pix), txt))
cbDelegate.addItems(['choice1', 'choice2'])
self.tableView.setIndexWidget(index, cbDelegate)
self.QSModel.setData(self.QSModel.index(row, 2), 'data')
self.QSModel.item(row, 1).setEditable(True)
在本例中,我将使用
QStandartItem
:
def populate(self):
row = self.QSModel.rowCount()
for x in range(7):
self.QSModel.insertRow(row)
self.QSModel.setData(self.QSModel.index(row, 0), 'data')
self.QSModel.item(row, 0).setEditable(True)
self.QSModel.setData(self.QSModel.index(row, 1), 'data')
self.QSModel.item(row, 1).setEditable(True)
if x % 2 == 0:
item = self.tableView.model().item(row, 1)
cbDelegate = QComboBox()
cbDelegate.currentIndexChanged[str].connect(item.setText)
cbDelegate.addItems(['choice1', 'choice2'])
self.tableView.setIndexWidget(item.index(), cbDelegate)
self.QSModel.setData(self.QSModel.index(row, 2), 'data')
self.QSModel.item(row, 1).setEditable(True)
执行类似操作的另一种方法是使用委托,为此我们创建一个继承自
QStyledItemDelegate
:
class ComboBoxDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
if index.row()%2 == 0:
opt = QStyleOptionComboBox()
opt.rect = option.rect
opt.currentText = index.data()
QApplication.style().drawComplexControl(QStyle.CC_ComboBox, opt, painter)
QApplication.style().drawControl(QStyle.CE_ComboBoxLabel, opt, painter)
else:
QStyledItemDelegate.paint(self, painter, option, index)
def createEditor(self, parent, option, index):
if index.row()%2 == 0:
combobox = QComboBox(parent)
options = ['choice1', 'choice2']
if index.data() not in options:
combobox.addItem(index.data())
combobox.addItems(options)
return combobox
return QStyledItemDelegate.createEditor(self, parent, option, index)
def setEditorData(self, editor, index):
if isinstance(editor, QComboBox):
text = index.data()
ix = editor.findText(text)
if ix > 0:
editor.setCurrentIndex(ix)
else:
index.model().setData(index, editor.currentText())
else:
QStyledItemDelegate.setEditorData(self, editor, index)
def setModelData(self, editor, model, index):
if isinstance(editor, QComboBox):
model.setData(index, editor.currentText())
else:
QStyledItemDelegate.setModelData(self, editor, model, index)
class GUI(QDialog):
def __init__(self):
super(GUI, self).__init__()
dirname = os.path.dirname(os.path.abspath(__file__))
uic.loadUi(os.path.join(dirname,'main.ui'), self)
self.btnPopulate.clicked.connect(self.populate)
self.header = ['col1', 'col2', 'col3']
self.QSModel = QStandardItemModel()
self.QSModel.setColumnCount(3)
self.QSModel.setHorizontalHeaderLabels(self.header)
self.tableView.setModel(self.QSModel)
self.tableView.setItemDelegateForColumn(1, ComboBoxDelegate(self.tableView))
self.populate()
def populate(self):
row = self.QSModel.rowCount()
for x in range(7):
for i, value in enumerate(['data1', 'data2', 'data3']):
self.QSModel.setItem(row+x, i, QStandardItem(value))
self.QSModel.item(row+x, i).setEditable(True)