PyQt:如何在选择项目时保持ComboBox打开

时间:2016-03-06 11:49:27

标签: python qt pyqt pyside

按照以下链接提供的解决方案(效果很好):

PyQt: How to set Combobox Items be Checkable?

如何在选择项目时保持ComboBox处于打开状态? 目前,使用提供的解决方案,在每个选择上,列表都会折叠...

2 个答案:

答案 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_())