PyQT:如何设置Combobox只读

时间:2014-04-03 17:19:10

标签: python pyqt qcombobox

我知道Combobox小部件有.setEnabled(bool)方法。但除了使它不可用之外,这个方法还会使这个小部件变灰。我需要的是设置Combobox,使其显示为活动但仍然是只读的。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是破坏适当的事件处理程序。这可以使用子类:

来完成
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)

就个人而言,我更愿意禁用组合框,或者重置其项目列表,因此只有一个选择。

答案 1 :(得分:0)

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

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

QComboBox有一个方法 lineEdit 。只需传递它就可以访问QLineEdit方法

我希望这就是你要找的东西。

答案 2 :(得分:-1)

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

self.comboBox.setEditable(False)

并且,您也可以通过不在模型

中设置可编辑标志来实现此目的
def flags( self,index):
    return QtCore.Qt.ItemIsEnabled |QtCore.Qt.ItemIsSelectable

这是无关紧要的,但你似乎只是通过查看PyQt类参考就可以解决很多问题,我们很乐意帮助你,但是提出可以轻松解决的问题是没有意义的,并且是一个浪费你宝贵的时间。

以下是参考的链接。 Reference Link