Pyqt5自定義控件–帶全選功能的複選框

  • 2020 年 3 月 11 日
  • 筆記

本篇的例子實現了一個帶全選功能的複選框:

#自定義控件--實現了一個帶全選功能的複選框  import sys  from PyQt5.QtWidgets import QApplication, QListWidget, QCheckBox,QListWidgetItem  from PyQt5.QtCore import Qt      class FilteredList(QListWidget):      #繼承自列表控件      def __init__(self, textList, parent=None):          super().__init__(parent)          self.selectAll_ch = QCheckBox("全選(selectAll)")          self.selectAll_ch.setCheckState(Qt.Checked)          self.selectAll_ch.stateChanged[int].connect(self.on_selectAll)#          item = QListWidgetItem(self)          self.setItemWidget(item, self.selectAll_ch )#列表控件的項設為 QCheckBox          self.dict = dict()          self.boxes = set()          for index, text in enumerate(textList):              ch = QCheckBox(text)              ch.setCheckState(Qt.Unchecked)              ch.stateChanged[int].connect(self.on_stateChanged)              #item.setCheckState(Qt.Unchecked)#              item = QListWidgetItem(self)              self.setItemWidget(item, ch)              self.boxes.add(ch)              self.dict[index] = ch        def on_selectAll(self,state):          if state == 2:              for ch in self.boxes:                  ch.setCheckState(2)          if state == 0:              for ch in self.boxes:                  ch.setCheckState(0)        def on_stateChanged(self,state):          ch = self.sender()          if state:              if len([ch for ch in self.boxes if ch.checkState()]) == self.count()-1:          #0 不選中, 1 部分選中,2 全選中 #Qt.Unchecked #Qt.PartiallyChecked #Qt.Checked                  self.selectAll_ch.setCheckState(2)              else:                  self.selectAll_ch.setCheckState(1)          else:              if len([k for k in self.boxes if k.checkState()]):                  self.selectAll_ch.setCheckState(1)              else:                  self.selectAll_ch.setCheckState(0)        def keyPressEvent(self, event):          #Ctrl+A 全選          if event.modifiers() & Qt.ControlModifier and event.key()==Qt.Key_A:              self.selectAll_ch.setCheckState(2)    if __name__ == '__main__':      app = QApplication(sys.argv)      myList = FilteredList(textList=["a","b","c","d"])      myList.show()      sys.exit(app.exec_())