PyQT:如何设置组合框为只读

1 投票
4 回答
7961 浏览
提问于 2025-04-18 01:12

我知道组合框(Combobox)有一个叫做 .setEnabled(bool) 的方法,可以用来控制它是否可用。不过,这个方法除了让组合框变得不可用之外,还会把它显示成灰色。我想要的是让组合框看起来是活跃的,但又保持只读状态。有没有什么好主意?

4 个回答

-1

你的答案是需要把 setEditable 设置为 False。

self.comboBox.setEditable(False)

另外,你也可以通过不在模型中设置 Editable 标志来实现这个效果。

def flags( self,index):
    return QtCore.Qt.ItemIsEnabled |QtCore.Qt.ItemIsSelectable

这虽然不太相关,但你似乎问了很多只要查看 PyQt 类参考就能解决的问题。我们很乐意帮助你,但问那些简单的问题其实没必要,这样只会浪费你宝贵的时间。

这里是参考链接。 参考链接

0
cb=QComboBox()
cb.lineEdit().setReadOnly(True)

或者

LE=QLineEdit()
LE.setReadOnly(True)
self.comboBox.setLineEdit(LE)

QComboBox 有一个方法叫 lineEdit。只需要调用这个方法,就可以使用 QLineEdit 的功能了。

希望这正是你想要的。

2

虽然有点晚了,但如果有人需要一个在设置文本后变为只读的下拉框(ComboBox),你可以使用setEnabled()这个方法来禁用任何Qwidget。

所以

self.cb = QComboBox()
self.cb.setEditText("Whatever")
self.cb.setEnabled(False)

希望我能帮到你

3

一种方法是覆盖合适的事件处理程序。你可以通过创建一个子类来实现:

class ComboBox(QtGui.QComboBox):
    def __init__(self, parent):
        QtGui.QComboBox.__init__(self, parent)
        self.readonly = False

    def mousePressEvent(self, event):
        if not self.readonly:
            QtGui.QComboBox.mousePressEvent(self, event)

    def keyPressEvent(self, event):
        if not self.readonly:
            QtGui.QComboBox.keyPressEvent(self, event)

    def wheelEvent(self, event):
        if not self.readonly():
            QtGui.QComboBox.wheelEvent(self, event)

或者使用事件过滤器:

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)  
        self.combo = QtGui.QComboBox(self)
        self.combo.readonly = False
        self.combo.installEventFilter(self)
        ...

    def eventFilter(self, source, event):
        if (source is self.combo and self.combo.readonly and (
            event.type() == QtCore.QEvent.MouseButtonPress or
            event.type() == QtCore.QEvent.KeyPress or
            event.type() == QtCore.QEvent.Wheel)):
            return True
        return QtGui.QWidget.eventFilter(self, source, event)

不过我个人更倾向于禁用这个组合框,或者重置它的选项列表,让它只有一个选择。

撰写回答