当前位置:   article > 正文

PyQt6 优化操作:下拉列表框 QcomboBox 支持多选(含全选项)_python qt6 下拉多选框

python qt6 下拉多选框

1. 效果展示

<全选>

<取消全选>

<选中部分内容>

2. 知识点

1. Model/View

Model-View-Controller (Model-View-Controller, MVC)是一种源自Smalltalk的设计模式,经常用于构建用户界面;如果 View 和 Controller 对象被组合,结果就是 Model/View 架构。Model负责提供数据,而View负责展示数据,这种分离使得可以在多个不同的View中显示相同的数据,或实现新的View类型,而无需更改底层数据结构。关于Model/View的更多信息可参考下方<参考链接-1>。

2. QComboBox

QComboBox 中的 model 是一个数据模型,它用于存储和管理下拉列表框中的选项数据。在 PyQt 中,QComboBox 的 model 通常是一个 QStandardItemModel 对象,它可以通过 addItem()、addItems()、insertItem()、removeItem() 等方法来添加、删除和修改选项数据。

QComboBox 中的 view 是一个视图,它用于显示下拉列表框中的选项数据。在 PyQt 中,QComboBox 的 view 通常是一个 QListView 对象,它可以通过 setView() 方法来设置。

官方文档:

 QComboBox — PyQt Documentation v6.6.0

 QAbstractItemModel — PyQt Documentation v6.6.0

3. 代码部分

  1. import sys
  2. from PyQt6.QtWidgets import QComboBox, QMainWindow, QApplication, QToolTip, QLineEdit
  3. from PyQt6.QtCore import Qt
  4. from PyQt6.QtGui import QFont
  5. class CheckableComboBox(QComboBox):
  6. def __init__(self, parent=None):
  7. super(CheckableComboBox, self).__init__(parent)
  8. QToolTip.setFont(QFont('Times New Roman', 15)) # 设置提示框字体和字号
  9. self.setLineEdit(QLineEdit())
  10. self.lineEdit().setReadOnly(True)
  11. self.view().clicked.connect(self.selectItemAction)
  12. self.addCheckableItem('全选')
  13. self.SelectAllStatus = 1
  14. def addCheckableItem(self, text):
  15. super().addItem(text)
  16. item = self.model().item(self.count() - 1, 0)
  17. item.setFlags(Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsEnabled)
  18. item.setCheckState(Qt.CheckState.Unchecked)
  19. item.setToolTip(text)
  20. def addCheckableItems(self, texts):
  21. for text in texts:
  22. self.addCheckableItem(text)
  23. def ifChecked(self, index):
  24. item = self.model().item(index, 0)
  25. return item.checkState() == Qt.CheckState.Checked
  26. def checkedItems(self):
  27. return [self.itemText(i) for i in range(self.count()) if self.ifChecked(i)]
  28. def checkedItemsStr(self):
  29. return ';'.join(self.checkedItems()).strip('全选').strip(';')
  30. def showPopup(self):
  31. self.view().setMinimumWidth(3*self.width()//2) # 下拉列表宽度加大
  32. self.view().setMaximumHeight(200) # 最大高度为200
  33. super().showPopup()
  34. def selectItemAction(self, index):
  35. if index.row() == 0:
  36. for i in range(self.model().rowCount()):
  37. if self.SelectAllStatus:
  38. self.model().item(i).setCheckState(Qt.CheckState.Checked)
  39. else:
  40. self.model().item(i).setCheckState(Qt.CheckState.Unchecked)
  41. self.SelectAllStatus = (self.SelectAllStatus + 1) % 2
  42. self.lineEdit().clear()
  43. self.lineEdit().setText(self.checkedItemsStr())
  44. def clear(self) -> None:
  45. super().clear()
  46. self.addCheckableItem('全选')
  47. def select_all(self):
  48. for i in range(self.model().rowCount()):
  49. self.model().item(i).setCheckState(Qt.CheckState.Checked)
  50. self.lineEdit().setText(self.checkedItemsStr())
  51. class Ui_Study(QMainWindow):
  52. def __init__(self):
  53. super().__init__()
  54. self.resize(500, 500)
  55. self.setMinimumSize(500, 500)
  56. self.combobox = CheckableComboBox(self)
  57. self.combobox.move(20, 20)
  58. self.combobox.resize(200, 30)
  59. self.line_edit = QLineEdit(self)
  60. self.line_edit.move(20, 80)
  61. self.line_edit.resize(300, 30)
  62. self.combobox.addCheckableItems(['sdsfdsf', 'hgjghj', 'reyeyey'])
  63. self.combobox.setCurrentIndex(-1)
  64. self.combobox.lineEdit().textChanged.connect(lambda: self.line_edit.setText(self.combobox.checkedItemsStr()))
  65. self.show()
  66. if __name__ == '__main__':
  67. app = QApplication(sys.argv)
  68. my_ui = Ui_Study()
  69. a = my_ui.combobox
  70. sys.exit(app.exec())

部分细节优化点说明:

1. 通过setToolTip,给每个项目增加一个提示框,鼠标经过时显示其内容;

2. 重写showPopup函数,让下拉框宽度大于控件原本宽度,可以显示更多内容;

优化前(ComboBox宽度不够,例子略极端哈)

优化后

3. self.combobox.setCurrentIndex(-1),让选项框中不显示任何内容(默认会显示第一项);

4. 参考链接

Hello Qt(三十三)——Model/View官方文档_qt的 model/view框架能离线使用吗-CSDN博客

博客园这篇文章写的也很好,可作为参考:

https://www.cnblogs.com/TM0831/p/12588841.html

PyQt - Fixed title for combobox - Stack Overflow

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/560493
推荐阅读
相关标签
  

闽ICP备14008679号