2016-03-06 45 views
3

继在以下链接提供的解决方案(这很好地工作):PyQt的:如何保持组合框开放的同时选择项目

PyQt: How to set Combobox Items be Checkable?

我怎样才能保持组合框打开,同时选择项目? 目前,随着提供的解决方案,在每个选择,列表崩溃...

+0

我想你会显示一个弹出窗口,其中包含的项目为复选框 – danidee

+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_()) 
+0

以下解决方案在mac上无法使用。 请看以下视频: https://youtu.be/JjANkg2ndgw – Nir

+0

@尼尔。我无法在Mac上测试,所以我无法提供帮助。 – ekhumoro

1

也许更好地使用QListWidget/QListView来代替。如果您将它们设置为每个QListWidgetItem或在您的定制模型中(例如使用QStandardItemModel),那么可检查标志也应该与之一起使用。

为什么我建议不要使用组合框的原因:该小部件并不意味着保持打开以进行多项选择;你会违反用户的期望,并应该期待可用性问题(“我如何关闭这个选择?它不像其他人一样工作!”)。

相关问题