【问题标题】:QListWidget: mutually exclusive checkboxes?QListWidget:互斥复选框?
【发布时间】:2021-05-03 17:38:49
【问题描述】:

QListWidget 中的 QListWidgetItems 复选框是否有可能互斥?也许像 QButtonGroup 这样的东西?我还没有找到任何东西。

我有另一个想法,即通过 itemChanged 侦听器将每个 QListWidgetItem 的检查状态设置为 false,新检查的除外。但我不知道如何获取触发信号的项目。

【问题讨论】:

    标签: python pyqt pyqt5 qlistwidget qlistwidgetitem


    【解决方案1】:

    使用itemChanged 是正确的做法,您可以从它的参数中获取项目。

    为了避免递归,您必须暂时断开信号与实际检查“排他性”的函数的连接,设置/取消设置检查状态,然后重新连接。

    class ExclusiveList(QtWidgets.QListWidget):
        def __init__(self):
            super().__init__()
            self.checkedRow = 0
            for i in range(10):
                item = QtWidgets.QListWidgetItem('Item {}'.format(i + 1))
                item.setCheckState(
                    QtCore.Qt.Checked if i == self.checkedRow else QtCore.Qt.Unchecked)
                self.addItem(item)
    
            self.itemChanged.connect(self.checkExclusive)
    
        def checkExclusive(self, item):
            self.itemChanged.disconnect(self.checkExclusive)
            row = self.indexFromItem(item).row()
            if row != self.checkedRow:
                oldChecked = self.item(self.checkedRow)
                oldChecked.setCheckState(QtCore.Qt.Unchecked)
                self.checkedRow = row
            elif not item.checkState():
                # avoid unchecking the current checked item, so that one item will 
                # *always* be checked
                item.setCheckState(QtCore.Qt.Checked)
            self.itemChanged.connect(self.checkExclusive)
    

    【讨论】:

      【解决方案2】:

      我现在使用的解决方案是 QScrollArea,其中包含 QVBoxLayout 中的 QRadioButtons 列表。它的样式可能不像 QListWidget,但它可以满足我的需要。

      这是我正在使用的代码:

      from PyQt5.QtWidgets import QApplication, QRadioButton, QButtonGroup, QScrollArea, QWidget, QVBoxLayout
      import sys
      
      class QRadioButtonListWidget(QScrollArea):
      
          def __init__(self, inputList, signalConnect=None, parent=None):
              super(QRadioButtonListWidget, self).__init__(parent)
      
              self.inputList = inputList
              self.signalConnect = signalConnect
      
              self.initUI()
      
              if not signalConnect is None:
                  self.btnGroup.buttonClicked.connect(self.connector)
      
          def initUI(self):
              layout = QVBoxLayout()
              self.btnGroup = QButtonGroup()
              for i, elem in enumerate(self.inputList):
                  btn = QRadioButton(str(elem))
                  self.btnGroup.addButton(btn, i)
                  layout.addWidget(btn)
      
              widget = QWidget()
              widget.setLayout(layout)
              self.setWidget(widget)
      
          def connector(self, btn):
              self.signalConnect(self.btnGroup.id(btn))
      
      
      def printId(id):
          print("id clicked: " + str(id))
      
      app = QApplication(sys.argv)
      w = QRadioButtonListWidget([1, 2, 3, "A", "B", "C"], printId)
      w.show()
      app.exec_()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-02
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2011-12-26
        • 2011-03-04
        相关资源
        最近更新 更多