【问题标题】:PyQT: How to set Combobox Read-OnlyPyQT:如何设置 Combobox 只读
【发布时间】:2014-05-15 16:41:58
【问题描述】:

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

【问题讨论】:

  • 有什么想法吗?不要这样做。不要让 GUI 元素看起来像它们不是的东西。这对用户来说既不直观,也不适合开发人员。
  • 正如其他评论所提到的,您不应该这样做,因为它不是系统想要的,这意味着用户不会期望您的程序表现得像这样,这会导致并发症并且是不好的做法。如果您可以详细说明您的程序到底是什么,我们可以提供其他一些解决方案。如果您想要 1 个选择,您可以做的最好的事情是删除项目并只保留用户的项目,我认为不可能在不将其变灰的情况下禁用它。
  • 如果你真的需要,你可以使用setStyleSheet("color: ...")改变它的外观
  • 有两个 listWidgets 显示具有完全相同属性的相同类别的项目。第一个 ListWidget 是只读的。当用户单击一个项目时,组合框仅“传递”一个信息。 Combobox 仍然从所有可用选项中正确显示正确的属性名称,但将其更改为 somethingelse 不会更改 ListWidget 项的属性。另一个 listWidget 以读写模式显示项目。这意味着使用组合框下拉菜单更改属性将更改项目的属性。

标签: python pyqt qcombobox


【解决方案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)

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

【讨论】:

  • @Sputnix。没问题。 PS:您介意指出您认为哪个答案最有用吗?
【解决方案2】:
cb=QComboBox()
cb.lineEdit().setReadOnly(True)

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

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

我希望这就是你要找的。​​p>

【讨论】:

    【解决方案3】:

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

    self.comboBox.setEditable(False)
    

    而且,您也可以通过不在模型中设置可编辑标志来实现此目的

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

    这无关,但您似乎提出了很多问题,只需查看 PyQt 类参考即可解决,我们很乐意为您提供帮助,但提出可以轻松解决的问题没有意义,而且是浪费你宝贵的时间。

    这里是参考链接。 Reference Link

    【讨论】:

    • setEditable 只改变了组合框的文本内容是否可以编辑,组合框已经默认不可编辑,所以setEditable(False) 在这里实际上并没有任何作用。
    • @mata : 是的,只是列出所有选项。
    • 感谢您提供文档链接!但显然我问的一个问题超出了文档的组合框类描述。因为没有可用的方法来获得我需要的东西(从组合框)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多