按照以下链接提供的解决方案(效果很好):
PyQt: How to set Combobox Items be Checkable?
如何在选择项目时保持ComboBox处于打开状态? 目前,使用提供的解决方案,在每个选择上,列表都会折叠...
答案 0 :(得分:1)
或许最好使用QListWidget
/ QListView
。如果您使用每个QListWidgetItem
或在自定义模型中设置(例如使用QStandardItemModel
),可检查标记也可以使用它。
我建议不要使用组合框:这个小部件并不意味着保持开放以进行多项选择;你会违反用户的期望并且应该考虑可用性问题("我如何关闭这些选择?它不会像其他人一样工作!")。
答案 1 :(得分:1)
以下是保持列表打开的链接解决方案的修订版。可以通过单击列表外部或按 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_())