继在以下链接提供的解决方案(这很好地工作):PyQt的:如何保持组合框开放的同时选择项目
PyQt: How to set Combobox Items be Checkable?
我怎样才能保持组合框打开,同时选择项目? 目前,随着提供的解决方案,在每个选择,列表崩溃...
继在以下链接提供的解决方案(这很好地工作):PyQt的:如何保持组合框开放的同时选择项目
PyQt: How to set Combobox Items be Checkable?
我怎样才能保持组合框打开,同时选择项目? 目前,随着提供的解决方案,在每个选择,列表崩溃...
下面是链接解决方案的一个修订版,它保持列表公开。该列表可以通过点击外部来关闭,或按Esc。
from PyQt4 import QtCore, QtGui
class CheckableComboBox(QtGui.QComboBox):
def __init__(self, parent=None):
super(CheckableComboBox, self).__init__(parent)
self.view().pressed.connect(self.handleItemPressed)
self._changed = False
def handleItemPressed(self, index):
item = self.model().itemFromIndex(index)
if item.checkState() == QtCore.Qt.Checked:
item.setCheckState(QtCore.Qt.Unchecked)
else:
item.setCheckState(QtCore.Qt.Checked)
self._changed = True
def hidePopup(self):
if not self._changed:
super(CheckableComboBox, self).hidePopup()
self._changed = False
def itemChecked(self, index):
item = self.model().item(index, self.modelColumn())
return item.checkState() == QtCore.Qt.Checked
def setItemChecked(self, index, checked=True):
item = self.model().item(index, self.modelColumn())
if checked:
item.setCheckState(QtCore.Qt.Checked)
else:
item.setCheckState(QtCore.Qt.Unchecked)
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.combo = CheckableComboBox(self)
for index in range(6):
self.combo.addItem('Item %d' % index)
self.combo.setItemChecked(index, False)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.combo)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 200, 100)
window.show()
sys.exit(app.exec_())
也许更好地使用QListWidget
/QListView
来代替。如果您将它们设置为每个QListWidgetItem
或在您的定制模型中(例如使用QStandardItemModel
),那么可检查标志也应该与之一起使用。
为什么我建议不要使用组合框的原因:该小部件并不意味着保持打开以进行多项选择;你会违反用户的期望,并应该期待可用性问题(“我如何关闭这个选择?它不像其他人一样工作!”)。
我想你会显示一个弹出窗口,其中包含的项目为复选框 – danidee
,如果你把它打开以后每个选择你将如何折叠列表的更好吗? –