PyQT:如何设置组合框为只读
我知道组合框(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)
不过我个人更倾向于禁用这个组合框,或者重置它的选项列表,让它只有一个选择。