📅  最后修改于: 2023-12-03 15:18:46.914000             🧑  作者: Mango
在PyQt5中,如果想要设置一个组合框不可编辑,但是可选项可以选择,则可以使用QComboBox
的setEditable(False)
方法。
但是,如果想要将皮肤设置为不可编辑的组合框的行编辑部分,需要自定义QStyledItemDelegate类。
以下是示例代码和说明:
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QComboBox, QStyledItemDelegate, QStyleOptionViewItem, QApplication
class ComboBoxDelegate(QStyledItemDelegate):
def initStyleOption(self, option, index):
# 这里我们只需要修改可编辑部分的皮肤
if index.column() == 0:
option.features &= ~QStyleOptionViewItem.EditFocusRect
option.widget.setStyleSheet("""
QComboBox::drop-down { border: none; }
QComboBox::down-arrow {
image: url(down_arrow_disabled.png);
}
QComboBox::down-arrow:disabled {
image: url(down_arrow_disabled.png);
}
""")
super(ComboBoxDelegate, self).initStyleOption(option, index)
class MyComboBox(QComboBox):
def __init__(self, parent=None):
super(MyComboBox, self).__init__(parent)
self.setFixedHeight(30)
delegate = ComboBoxDelegate(self)
self.setItemDelegate(delegate)
if __name__ == '__main__':
app = QApplication([])
model = QStandardItemModel(4, 2)
for row in range(4):
for column in range(2):
item = QStandardItem('Item {}, {}'.format(row, column))
model.setItem(row, column, item)
combo_box = MyComboBox()
combo_box.setModel(model)
combo_box.setModelColumn(1)
combo_box.setEditable(True)
combo_box.show()
app.exec_()
首先,我们定义了一个继承自QStyledItemDelegate
的类(命名为ComboBoxDelegate),并重写了其中的initStyleOption
方法,用于修改组合框的外观。
在这个方法中,我们检查当前需要修改外观的单元格是否是组合框的第一列(也就是可编辑部分所在列)。如果是,则隐藏焦点框、隐藏下拉箭头的边框并修改下拉箭头的皮肤,最后调用超类的initStyleOption
方法。
接着,我们定义了一个自定义的组合框类(命名为MyComboBox),并在其中设置了一个高度、一个自定义的代理类(即上文定义的ComboBoxDelegate)以及调用了setModel
和setModelColumn
方法来指定组合框显示的内容。
最后,我们创建了一个QApplication对象,构造一个QStandardItemModel,并将其与我们定义的自定义组合框关联后显示出来。
运行代码,效果如下图所示: