QComboBox 和 app.setStyle("cleanlooks")
QComboBox and app.setStyle("cleanlooks")
下面的代码创建了一个 QComboBox
并分配了 QAbstractTableModel
模型。奇怪的是,如果 app.setStyle("cleanlooks")
被注释掉,则 QCombo 在单击时不会下拉菜单。有什么建议为什么会这样吗?
from PyQt import QtGui, QtCore
class tableModel(QtCore.QAbstractTableModel):
def __init__(self, parent=None, *args):
QtCore.QAbstractTableModel.__init__(self, parent, *args)
self.items = [['Item_A000', '10'],['Item_B001', '20'],['Item_A002', '30'],['Item_B003', '40'],['Item_B004', '50']]
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def columnCount(self, parent=QtCore.QModelIndex()):
return 2
def data(self, index, role):
if not index.isValid(): return
row=index.row()
column=index.column()
return self.items[row][column]
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
# app.setStyle("cleanlooks")
tModel=tableModel()
combobox = QtGui.QComboBox()
combobox.setModel(tModel)
combobox.show()
sys.exit(app.exec_())
在 linux (ubuntu 14.04 lts) 你的代码在这两种情况下都有效。在我的 windows 7 上它在任何情况下都不起作用,即使 app.setStyle("cleanlooks")
没有被注释掉。
由于QCombobox只显示一维列表,没有二维表,我想问题出在二维表模型或其索引上。
我尝试了 QstandardItemModel,它适用于 linux 以及 windows 7。它允许通过用户角色访问项目中的更多列,添加了第三列以显示它。
class tableModel(QtGui.QStandardItemModel):
def __init__(self, parent=None, *args):
QtGui.QStandardItemModel.__init__(self, parent, *args)
self.items = [['Item_A000', '10','abcd'],['Item_B001', '20','efgh'],['Item_A002', '30','ijkl'],['Item_B003', '40','mnop'],['Item_B004', '50','qrst']]
for i in range(0,len(self.items)):
item = QtGui.QStandardItem()
item.setData(self.items[i][0],2) # displayrole
item.setData(self.items[i][1],256) # userrole
item.setData(self.items[i][2],257) # userrole
self.appendRow(item)
def currentChanged(self, index):
print('itemdata[0] :', self.data(self.index(index,0),2), '; itemdata[1] :', self.data(self.index(index,0), 256), '; itemdata[2]: ', self.data(self.index(index,0),257))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
# app.setStyle("cleanlooks")
tModel=tableModel()
combobox = QtGui.QComboBox() # widget)
combobox.setModel(tModel
combobox.currentIndexChanged.connect(combobox.model().currentChanged)
combobox.show()
sys.exit(app.exec_())
这听起来很奇怪,但您的问题是因为您的模型 data
方法为 DisplayRole
以外的其他角色返回了不正确的值。可能 DecorationRole
但我不确定 - 您需要进行更多测试才能确定,但无论如何您的代码都不正确。
您需要将数据方法第一行测试更改为:
def data(self, index, role):
if not index.isValid() or role != QtCore.Qt.DisplayRole: return
我想您会发现这可以解决您眼前的问题。
据推测它正在使用 CleanLooks,因为没有使用装饰,或者处理方式不同。
下面的代码创建了一个 QComboBox
并分配了 QAbstractTableModel
模型。奇怪的是,如果 app.setStyle("cleanlooks")
被注释掉,则 QCombo 在单击时不会下拉菜单。有什么建议为什么会这样吗?
from PyQt import QtGui, QtCore
class tableModel(QtCore.QAbstractTableModel):
def __init__(self, parent=None, *args):
QtCore.QAbstractTableModel.__init__(self, parent, *args)
self.items = [['Item_A000', '10'],['Item_B001', '20'],['Item_A002', '30'],['Item_B003', '40'],['Item_B004', '50']]
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)
def columnCount(self, parent=QtCore.QModelIndex()):
return 2
def data(self, index, role):
if not index.isValid(): return
row=index.row()
column=index.column()
return self.items[row][column]
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
# app.setStyle("cleanlooks")
tModel=tableModel()
combobox = QtGui.QComboBox()
combobox.setModel(tModel)
combobox.show()
sys.exit(app.exec_())
在 linux (ubuntu 14.04 lts) 你的代码在这两种情况下都有效。在我的 windows 7 上它在任何情况下都不起作用,即使 app.setStyle("cleanlooks")
没有被注释掉。
由于QCombobox只显示一维列表,没有二维表,我想问题出在二维表模型或其索引上。
我尝试了 QstandardItemModel,它适用于 linux 以及 windows 7。它允许通过用户角色访问项目中的更多列,添加了第三列以显示它。
class tableModel(QtGui.QStandardItemModel):
def __init__(self, parent=None, *args):
QtGui.QStandardItemModel.__init__(self, parent, *args)
self.items = [['Item_A000', '10','abcd'],['Item_B001', '20','efgh'],['Item_A002', '30','ijkl'],['Item_B003', '40','mnop'],['Item_B004', '50','qrst']]
for i in range(0,len(self.items)):
item = QtGui.QStandardItem()
item.setData(self.items[i][0],2) # displayrole
item.setData(self.items[i][1],256) # userrole
item.setData(self.items[i][2],257) # userrole
self.appendRow(item)
def currentChanged(self, index):
print('itemdata[0] :', self.data(self.index(index,0),2), '; itemdata[1] :', self.data(self.index(index,0), 256), '; itemdata[2]: ', self.data(self.index(index,0),257))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
# app.setStyle("cleanlooks")
tModel=tableModel()
combobox = QtGui.QComboBox() # widget)
combobox.setModel(tModel
combobox.currentIndexChanged.connect(combobox.model().currentChanged)
combobox.show()
sys.exit(app.exec_())
这听起来很奇怪,但您的问题是因为您的模型 data
方法为 DisplayRole
以外的其他角色返回了不正确的值。可能 DecorationRole
但我不确定 - 您需要进行更多测试才能确定,但无论如何您的代码都不正确。
您需要将数据方法第一行测试更改为:
def data(self, index, role):
if not index.isValid() or role != QtCore.Qt.DisplayRole: return
我想您会发现这可以解决您眼前的问题。 据推测它正在使用 CleanLooks,因为没有使用装饰,或者处理方式不同。