下面的代码创建一个分配了QComboBox模型的单个QAbstractTableModel。奇怪,如果将app.setStyle("cleanlooks")注释掉,单击QCombo时不会将其菜单下拉。任何建议为什么会这样?

python - QComboBox和app.setStyle(“cleanlooks”)-LMLPHP

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_())

关于python - QComboBox和app.setStyle(“cleanlooks”),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31998023/

10-09 13:25