打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PyQt5

目录

效果: 

代码: 

使用:

QListWidget分页多选控件主要是应对有很多的选项,从中选择需要的某几项,并将选择的结果传递给其它控件或其它窗体

效果: 

代码: 

导入需要的包

  1. import sys,math
  2. from PyQt5 import QtCore,QtWidgets
  3. from typing import Dict,Any,List

分页QListWidget多选控件

  1. class MultiChoicePageListWidget(QtWidgets.QWidget):
  2. sinout_signal = QtCore.pyqtSignal(object)
  3. def __init__(self):
  4. super().__init__()
  5. self.init_data()
  6. self.init_ui()
  7. def init_data(self):
  8. self.whole_left_list: List = []
  9. self.whole_right_list: List = []
  10. self.origin_right_list: List = []
  11. self.current_right_list: List = []
  12. self.current_left_list: List = []
  13. self.single_page_count: int = 10
  14. self.left_total_page_count: int = 0
  15. self.left_total_row_count: int = 0
  16. self.left_current_page_number: int = 1
  17. self.right_total_page_count: int = 0
  18. self.right_total_row_count: int = 0
  19. self.right_current_page_number: int = 1
  20. pass
  21. def init_ui(self):
  22. check_submit_btn = QtWidgets.QPushButton('确认提交')
  23. check_submit_btn.clicked.connect(self.check_submit_btn_clicked)
  24. layout_checksubmit = QtWidgets.QHBoxLayout()
  25. layout_checksubmit.addStretch(1)
  26. layout_checksubmit.addWidget(check_submit_btn)
  27. # 左侧 start
  28. tip_left_query_label = QtWidgets.QLabel('模糊查询')
  29. self.left_query_lineedit = QtWidgets.QLineEdit()
  30. left_query_btn = QtWidgets.QPushButton('查询')
  31. left_query_btn.clicked.connect(self.left_query_btn_clicked)
  32. left_reset_btn = QtWidgets.QPushButton('重置')
  33. left_reset_btn.clicked.connect(self.left_reset_btn_clicked)
  34. layout_left_control = QtWidgets.QGridLayout()
  35. layout_left_control.addWidget(tip_left_query_label,0,0,1,1)
  36. layout_left_control.addWidget(self.left_query_lineedit,0,1,1,3)
  37. layout_left_control.addWidget(left_query_btn,1,0,1,2)
  38. layout_left_control.addWidget(left_reset_btn,1,2,1,2)
  39. left_pre_btn = QtWidgets.QPushButton('<<')
  40. left_pre_btn.clicked.connect(self.left_pre_btn_clicked)
  41. left_next_btn = QtWidgets.QPushButton('>>')
  42. left_next_btn.clicked.connect(self.left_next_btn_clicked)
  43. self.left_page_lineedit = QtWidgets.QSpinBox()
  44. left_go_btn = QtWidgets.QPushButton('前往')
  45. left_go_btn.clicked.connect(self.left_go_btn_clicked)
  46. self.left_total_page_label = QtWidgets.QLabel('共0页')
  47. self.left_total_row_label = QtWidgets.QLabel('共0条')
  48. self.left_current_page_label = QtWidgets.QLabel('第1页')
  49. layout_left_up = QtWidgets.QHBoxLayout()
  50. layout_left_up.addWidget(left_pre_btn)
  51. layout_left_up.addWidget(left_next_btn)
  52. layout_left_up.addWidget(self.left_page_lineedit)
  53. layout_left_up.addWidget(left_go_btn)
  54. layout_left_up.addWidget(self.left_total_page_label)
  55. layout_left_up.addWidget(self.left_total_row_label)
  56. layout_left_up.addWidget(self.left_current_page_label)
  57. self.left_content_list_widget = QtWidgets.QListWidget()
  58. self.left_content_list_widget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
  59. layout_left = QtWidgets.QVBoxLayout()
  60. layout_left.addLayout(layout_left_control)
  61. layout_left.addLayout(layout_left_up)
  62. layout_left.addWidget(self.left_content_list_widget)
  63. # 左侧 end
  64. # 中间 start
  65. add_btn = QtWidgets.QPushButton('添加>>')
  66. add_btn.clicked.connect(self.add_btn_clicked)
  67. delete_btn = QtWidgets.QPushButton('<<删除')
  68. delete_btn.clicked.connect(self.delete_btn_clicked)
  69. clear_btn = QtWidgets.QPushButton('清空')
  70. clear_btn.clicked.connect(self.clear_btn_clicked)
  71. layout_center = QtWidgets.QVBoxLayout()
  72. layout_center.addStretch(1)
  73. layout_center.addWidget(add_btn)
  74. layout_center.addWidget(delete_btn)
  75. layout_center.addWidget(clear_btn)
  76. layout_center.addStretch(1)
  77. # 中间 end
  78. # 右侧 start
  79. tip_right_query_label = QtWidgets.QLabel('模糊查询')
  80. self.right_query_lineedit = QtWidgets.QLineEdit()
  81. right_query_btn = QtWidgets.QPushButton('查询')
  82. right_query_btn.clicked.connect(self.right_query_btn_clicked)
  83. right_reset_btn = QtWidgets.QPushButton('重置')
  84. right_reset_btn.clicked.connect(self.right_reset_btn_clicked)
  85. right_origin_btn = QtWidgets.QPushButton('回到初始')
  86. right_origin_btn.clicked.connect(self.right_origin_btn_clicked)
  87. layout_right_control = QtWidgets.QGridLayout()
  88. layout_right_control.addWidget(tip_right_query_label, 0, 0, 1, 2)
  89. layout_right_control.addWidget(self.right_query_lineedit, 0, 1, 1, 4)
  90. layout_right_control.addWidget(right_query_btn, 1, 0, 1, 2)
  91. layout_right_control.addWidget(right_reset_btn, 1, 2, 1, 2)
  92. layout_right_control.addWidget(right_origin_btn,1,4,2,2)
  93. right_pre_btn = QtWidgets.QPushButton('<<')
  94. right_pre_btn.clicked.connect(self.right_pre_btn_clicked)
  95. right_next_btn = QtWidgets.QPushButton('>>')
  96. right_next_btn.clicked.connect(self.right_next_btn_clicked)
  97. self.right_page_lineedit = QtWidgets.QSpinBox()
  98. right_go_btn = QtWidgets.QPushButton('前往')
  99. right_go_btn.clicked.connect(self.right_go_btn_clicked)
  100. self.right_total_page_label = QtWidgets.QLabel('共0页')
  101. self.right_total_row_label = QtWidgets.QLabel('共0条')
  102. self.right_current_page_label = QtWidgets.QLabel('第1页')
  103. layout_right_up = QtWidgets.QHBoxLayout()
  104. layout_right_up.addWidget(right_pre_btn)
  105. layout_right_up.addWidget(right_next_btn)
  106. layout_right_up.addWidget(self.right_page_lineedit)
  107. layout_right_up.addWidget(right_go_btn)
  108. layout_right_up.addWidget(self.right_total_page_label)
  109. layout_right_up.addWidget(self.right_total_row_label)
  110. layout_right_up.addWidget(self.right_current_page_label)
  111. self.right_content_list_widget = QtWidgets.QListWidget()
  112. self.right_content_list_widget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
  113. layout_right = QtWidgets.QVBoxLayout()
  114. layout_right.addLayout(layout_right_control)
  115. layout_right.addLayout(layout_right_up)
  116. layout_right.addWidget(self.right_content_list_widget)
  117. # 右侧 end
  118. layout_down = QtWidgets.QHBoxLayout()
  119. layout_down.addLayout(layout_left,5)
  120. layout_down.addLayout(layout_center,1)
  121. layout_down.addLayout(layout_right,5)
  122. layout = QtWidgets.QVBoxLayout()
  123. layout.addLayout(layout_checksubmit)
  124. layout.addLayout(layout_down)
  125. self.setLayout(layout)
  126. pass
  127. def show_error_msg(self,error_msg:str):
  128. QtWidgets.QMessageBox.information(
  129. self,
  130. '提示',
  131. error_msg,
  132. QtWidgets.QMessageBox.Yes
  133. )
  134. def change_page(self,director:str):
  135. if director == 'left':
  136. start_dot = (self.left_current_page_number - 1) * self.single_page_count
  137. end_dot = start_dot + self.single_page_count
  138. current_data = self.current_left_list[start_dot:end_dot]
  139. self.left_content_list_widget.clear()
  140. self.left_content_list_widget.addItems(current_data)
  141. self.set_current_page_label(director)
  142. pass
  143. else:
  144. start_dot = (self.right_current_page_number - 1) * self.single_page_count
  145. end_dot = start_dot + self.single_page_count
  146. current_data = self.current_right_list[start_dot:end_dot]
  147. self.right_content_list_widget.clear()
  148. self.right_content_list_widget.addItems(current_data)
  149. self.set_current_page_label(director)
  150. pass
  151. pass
  152. def set_current_page_label(self,director:str):
  153. if director == 'left':
  154. self.left_current_page_label.setText(f" 第{self.left_current_page_number}页")
  155. else:
  156. self.right_current_page_label.setText(f" 第{self.right_current_page_number}页")
  157. pass
  158. def left_first_set_data(self):
  159. self.left_total_row_count = len(self.current_left_list)
  160. self.left_total_page_count = math.ceil(self.left_total_row_count / self.single_page_count)
  161. self.left_current_page_number = 1
  162. self.left_page_lineedit.setRange(1, self.left_total_page_count)
  163. self.left_total_row_label.setText(f" 共{self.left_total_row_count}条")
  164. self.left_total_page_label.setText(f" 共{self.left_total_page_count}页")
  165. self.change_page('left')
  166. pass
  167. def left_query_btn_clicked(self):
  168. query_str = self.left_query_lineedit.text()
  169. query_str = query_str.strip()
  170. if len(query_str)<=0:
  171. self.show_error_msg('请输入查询内容')
  172. return
  173. res_list = []
  174. for item in self.whole_left_list:
  175. if query_str in item:
  176. res_list.append(item)
  177. self.current_left_list = res_list
  178. self.left_first_set_data()
  179. pass
  180. def left_reset_btn_clicked(self):
  181. self.left_query_lineedit.setText('')
  182. self.current_left_list = self.whole_left_list
  183. self.left_first_set_data()
  184. pass
  185. def left_pre_btn_clicked(self):
  186. if self.left_current_page_number <= 1:
  187. self.show_error_msg('已经是首页')
  188. return
  189. self.left_current_page_number -= 1
  190. self.change_page('left')
  191. pass
  192. def left_next_btn_clicked(self):
  193. if self.left_current_page_number >= self.left_total_page_count:
  194. self.show_error_msg('已经在末页')
  195. return
  196. self.left_current_page_number += 1
  197. self.change_page('left')
  198. pass
  199. def left_go_btn_clicked(self):
  200. go_page = self.left_page_lineedit.value()
  201. go_page_int = int(go_page)
  202. if go_page_int <= 0 or go_page_int > self.left_total_page_count:
  203. self.show_error_msg('输入的页码超出范围')
  204. return
  205. self.left_current_page_number = go_page_int
  206. self.change_page('left')
  207. pass
  208. def add_btn_clicked(self):
  209. selected_items = self.left_content_list_widget.selectedItems()
  210. if len(selected_items)<=0:
  211. self.show_error_msg('请在左侧选择要添加的项')
  212. return
  213. text_list = [i.text() for i in selected_items]
  214. text_list.extend(self.current_right_list)
  215. right_text_set = set(text_list)
  216. self.current_right_list = list(right_text_set)
  217. self.right_first_set_data()
  218. pass
  219. def delete_btn_clicked(self):
  220. selected_items = self.right_content_list_widget.selectedItems()
  221. if len(selected_items)<=0:
  222. self.show_error_msg('请在右侧选择要删除的项')
  223. return
  224. text_list = [i.text() for i in selected_items]
  225. right_text_list = []
  226. for item in self.current_right_list:
  227. if item in text_list:
  228. continue
  229. right_text_list.append(item)
  230. self.current_right_list = right_text_list
  231. self.right_first_set_data()
  232. pass
  233. def clear_btn_clicked(self):
  234. self.current_right_list = []
  235. self.right_first_set_data()
  236. pass
  237. def right_first_set_data(self):
  238. self.right_total_row_count = len(self.current_right_list)
  239. self.right_total_page_count = math.ceil(self.right_total_row_count / self.single_page_count)
  240. self.right_current_page_number = 1
  241. self.right_page_lineedit.setRange(1, self.right_total_page_count)
  242. self.right_total_row_label.setText(f" 共{self.right_total_row_count}条")
  243. self.right_total_page_label.setText(f" 共{self.right_total_page_count}页")
  244. self.change_page('right')
  245. pass
  246. def right_query_btn_clicked(self):
  247. query_str = self.right_query_lineedit.text()
  248. query_str = query_str.strip()
  249. if len(query_str) <= 0:
  250. self.show_error_msg('请输入查询内容')
  251. return
  252. self.whole_right_list = self.current_right_list
  253. res_list = []
  254. for item in self.current_right_list:
  255. if query_str in item:
  256. res_list.append(item)
  257. self.current_right_list = res_list
  258. self.right_first_set_data()
  259. pass
  260. def right_reset_btn_clicked(self):
  261. self.current_right_list = self.whole_right_list
  262. self.right_query_lineedit.setText('')
  263. self.right_first_set_data()
  264. pass
  265. def right_pre_btn_clicked(self):
  266. if self.right_current_page_number <= 1:
  267. self.show_error_msg('已经是首页')
  268. return
  269. self.right_current_page_number -= 1
  270. self.change_page('right')
  271. pass
  272. def right_next_btn_clicked(self):
  273. if self.right_current_page_number >= self.right_total_page_count:
  274. self.show_error_msg('已经在末页')
  275. return
  276. self.right_current_page_number += 1
  277. self.change_page('right')
  278. pass
  279. def right_go_btn_clicked(self):
  280. go_page = self.right_page_lineedit.value()
  281. go_page_int = int(go_page)
  282. if go_page_int <= 0 or go_page_int > self.right_total_page_count:
  283. self.show_error_msg('输入的页码超出范围')
  284. return
  285. self.right_current_page_number = go_page_int
  286. self.change_page('right')
  287. pass
  288. def right_origin_btn_clicked(self):
  289. self.right_query_lineedit.setText('')
  290. self.current_right_list = self.origin_right_list
  291. self.right_first_set_data()
  292. pass
  293. def set_data(self,data:Dict[str,Any]):
  294. self.origin_right_list = data['whole_right']
  295. self.whole_left_list = data['whole_left']
  296. self.whole_right_list = data['whole_right']
  297. self.current_left_list = data['whole_left']
  298. self.current_right_list = data['whole_right']
  299. self.left_first_set_data()
  300. self.right_first_set_data()
  301. self.left_query_lineedit.setText('')
  302. self.right_query_lineedit.setText('')
  303. pass
  304. def check_submit_btn_clicked(self):
  305. self.sinout_signal.emit(self.current_right_list)
  306. pass
  307. pass

调用QListWidget分页多选控件的容器

  1. class ExampleWidget(QtWidgets.QWidget):
  2. def __init__(self):
  3. super().__init__()
  4. self.init_ui()
  5. def init_ui(self):
  6. self.list_widget = MultiChoicePageListWidget()
  7. self.list_widget.sinout_signal.connect(self.list_widget_sinout_emit)
  8. layout = QtWidgets.QVBoxLayout()
  9. layout.addWidget(self.list_widget)
  10. self.setLayout(layout)
  11. pass
  12. def set_data(self,data:Dict[str,Any]):
  13. self.list_widget.set_data(data)
  14. pass
  15. def list_widget_sinout_emit(self,data:List[str]):
  16. print(data)
  17. pass

使用:

  1. if __name__ == '__main__':
  2. whole_left = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66']
  3. whole_right = ['1','2','3','4','5']
  4. data = {
  5. 'whole_left':whole_left,
  6. 'whole_right':whole_right
  7. }
  8. QtCore.QCoreApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
  9. app = QtWidgets.QApplication(sys.argv)
  10. temp_win = ExampleWidget()
  11. temp_win.set_data(data)
  12. temp_win.show()
  13. app.exec()
  14. pass

运行:

清空右侧,并选中左侧所有包含“1”的选项:

 点击“清空”,清空右侧列表;在左侧模糊查询中输入1,点击“查询”按钮;接下来选中左侧包含“1”的内容,添加到右侧

 点击“确认提交”,后台接收到选中的结果

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python GUI教程(十六):在PyQt5中美化和装扮图形界面 | 码农网
一窥未来:PyQt5引领下一代Python GUI开发
PyQt5(3)快速界面设计
setStyleSheet来设置图形界面的外观
Qt入门笔记1
量化交易系统界面之pyqt5
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服