【发布时间】:2015-03-18 04:42:30
【问题描述】:
下面的代码创建了一个QTableView。双击其项目将使用委派的QComboBox 设置它。
问题:
当点击ComboBox 时,它的下拉菜单会暂时显示,然后它会折叠回到展开状态。
如果将comboBox 设置为使用combox.setEditable(True) 可编辑,
下拉菜单将根据需要保持打开状态。但随后combobox 的项目变为可编辑。这不是所需要的。由于combobox 的项目只能是可选的。
如何解决 combobox 的自我折叠行为?
附:然后我注意到,当ComboBox 设置为可编辑并且其下拉菜单展开时,模型的data() 不断被调用......自折叠行为是否可能由模型触发?
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class ComboDelegate(QItemDelegate):
comboItems=['Combo_Zero', 'Combo_One','Combo_Two']
def createEditor(self, parent, option, proxyModelIndex):
combo = QComboBox(parent)
combo.addItems(self.comboItems)
# combo.setEditable(True)
self.connect(combo, SIGNAL("currentIndexChanged(int)"), self, SLOT("currentIndexChanged()"))
return combo
def setModelData(self, combo, model, index):
comboIndex=combo.currentIndex()
text=self.comboItems[comboIndex]
model.setData(index, text)
print '\t\t\t ...setModelData() 1', text
@pyqtSlot()
def currentIndexChanged(self):
self.commitData.emit(self.sender())
class MyModel(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items=['Data_Item01','Data_Item02','Data_Item03']
def rowCount(self, parent=QModelIndex()):
return len(self.items)
def columnCount(self, parent=QModelIndex()):
return 1
def data(self, index, role):
if not index.isValid(): return QVariant()
row=index.row()
item=self.items[row]
if row>len(self.items): return QVariant()
if role == Qt.DisplayRole:
print ' << >> MyModel.data() returning ...', item
return QVariant(item)
def flags(self, index):
return Qt.ItemIsEditable | Qt.ItemIsEnabled
def setData(self, index, text):
self.items[index.row()]=text
if __name__ == '__main__':
app = QApplication(sys.argv)
model = MyModel()
tableView = QTableView()
tableView.setModel(model)
delegate = ComboDelegate()
tableView.setItemDelegate(delegate)
tableView.resizeRowsToContents()
tableView.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python qt pyqt qtableview qcombobox