📌  相关文章
📜  PyQt5 - 将皮肤设置为不可编辑组合框的行编辑部分(1)

📅  最后修改于: 2023-12-03 15:18:46.914000             🧑  作者: Mango

PyQt5 - 将皮肤设置为不可编辑组合框的行编辑部分

在PyQt5中,如果想要设置一个组合框不可编辑,但是可选项可以选择,则可以使用QComboBoxsetEditable(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)以及调用了setModelsetModelColumn方法来指定组合框显示的内容。

最后,我们创建了一个QApplication对象,构造一个QStandardItemModel,并将其与我们定义的自定义组合框关联后显示出来。

运行代码,效果如下图所示:

效果