自定义实现 PyQt5 下拉复选框 ComboCheckBox
一、前言
由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下拉复选框,主要就是继承 QComboBox 类,然后将复选框 QCheckBox 加入其中,并实现相应的功能。
最终实现的下拉复选框效果如下:
二、代码实现
1.主要方法
在 PyQt5 中,有几个主要的方法需要了解一下,方法名称和对应的含义如下:
QtWidgets.QComboBox.setView( itemView ) :设置 组合框弹出窗口中使用的视图 , 组合框获取视图的所有权。
QtWidgets.QcomboBox.setLineEdit( QLineEdit ) : 设置组合框 使用 的行 ,而不是当前行编辑窗口小部件。
QtWidgets.QListWidget.setItemWidget(item, widget) : 设置 要在给定的 item 中的 widget 组件 。
2.具体代码
实现下拉复选框的思路为用 setView() 方法将 QComboBox 下拉列表的视图改为 QListWidget 组件,然后将 QCheckBox 复选框用在 QListWiget 中,具体代码如下:
class ComboCheckBox(QComboBox): def __init__(self, items: list): """ initial function :param items: the items of the list """ super(ComboCheckBox, self).__init__() self.items = items # items list self.box_list = [] # selected items self.text = QLineEdit() # use to selected items self.text.setReadOnly(True) q = QListWidget() for i in range(len(self.items)): self.box_list.append(QCheckBox()) self.box_list[i].setText(self.items[i]) item = QListWidgetItem(q) q.setItemWidget(item, self.box_list[i]) self.box_list[i].stateChanged.connect(self.show_selected) self.setLineEdit(self.text) self.setModel(q.model()) self.setView(q) def get_selected(self) -> list: """ get selected items :return: """ ret = [] for i in range(len(self.items)): if self.box_list[i].isChecked(): ret.append(self.box_list[i].text()) return ret def show_selected(self): """ show selected items :return: """ self.text.clear() ret = '; '.join(self.get_selected()) self.text.setText(ret)
其中 show_selected()
用于显示被选中的内容,get_selected()
则用于获取所有被选中的内容并返回。
3.增加全选
要增加全选功能,首先是要在最前面加一个全选的选择框,然后为这个全选的选择框绑定相应的方法,用于实现全选功能和取消全选功能,具体代码如下:
def all_selected(self): """ decide whether to check all :return: """ # change state if self.state == 0: self.state = 1 for i in range(1, len(self.items)): self.box_list[i].setChecked(True) else: self.state = 0 for i in range(1, len(self.items)): self.box_list[i].setChecked(False) self.show_selected()
4.修改样式
由于默认的样式并不美观,所以我们可以对控件的样式进行自定义,例如字体大小、字体粗细等等,例如:
q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px") self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold")
三、完整程序
完善后的下拉复选框的运行程序代码如下:
from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidgetItem, QListWidget, QCheckBox, QApplication, QVBoxLayout, QWidget import sys class ComboCheckBox(QComboBox): def __init__(self, items: list): """ initial function :param items: the items of the list """ super(ComboCheckBox, self).__init__() self.items = ["全选"] + items # items list self.box_list = [] # selected items self.text = QLineEdit() # use to selected items self.state = 0 # use to record state q = QListWidget() for i in range(len(self.items)): self.box_list.append(QCheckBox()) self.box_list[i].setText(self.items[i]) item = QListWidgetItem(q) q.setItemWidget(item, self.box_list[i]) if i == 0: self.box_list[i].stateChanged.connect(self.all_selected) else: self.box_list[i].stateChanged.connect(self.show_selected) q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px") self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold") self.text.setReadOnly(True) self.setLineEdit(self.text) self.setModel(q.model()) self.setView(q) def all_selected(self): """ decide whether to check all :return: """ # change state if self.state == 0: self.state = 1 for i in range(1, len(self.items)): self.box_list[i].setChecked(True) else: self.state = 0 for i in range(1, len(self.items)): self.box_list[i].setChecked(False) self.show_selected() def get_selected(self) -> list: """ get selected items :return: """ ret = [] for i in range(1, len(self.items)): if self.box_list[i].isChecked(): ret.append(self.box_list[i].text()) return ret def show_selected(self): """ show selected items :return: """ self.text.clear() ret = '; '.join(self.get_selected()) self.text.setText(ret) class UiMainWindow(QWidget): def __init__(self): super(UiMainWindow, self).__init__() self.setWindowTitle('Test') self.resize(600, 400) combo = ComboCheckBox(["Python", "Java", "Go", "C++", "JavaScript", "PHP"]) layout = QVBoxLayout() layout.addWidget(combo) self.setLayout(layout) if __name__ == "__main__": app = QApplication(sys.argv) ui = UiMainWindow() ui.show() sys.exit(app.exec_())
总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 王心雅《诗意琼瑶》DTS-WAV
- 阿丽娅《印象》DTS6.1-WAV
- PS官方晒《怪物猎人:荒野》公测启动页面!你准备好了吗?
- 《怪物猎人:荒野》新怪物“赫猿兽”PV公布:残暴巨兽登场!
- 童丽2024 《千愁记旧情》8月最新 限量1:1母盘直刻[WAV+CUE][1.1G]
- 陈奕迅《认了吧》[新加坡纸盒版] [WAV+CUE][1.1G]
- 群星《小夫妻 电视原声带》[320K/MP3][113.44MB]
- 孙楠.2004-燃烧【华纳】【WAV+CUE】
- 群星.2003-英皇精挑细选VOL.1【英皇娱乐】【WAV+CUE】
- 林姗.2024-寄天的记忆【豪记】【FLAC分轨】
- 陈洁丽-《可改变HQ2》2024[WAV+CUE]
- 福田进一2024《魔鬼随想曲》WAV
- 群星《新歌龙卷风》2CD/DTS-ES[WAV]
- 群星《湮灭之潮 《明日之后》蓝潮资料片游戏原声带》[320K/MP3][50.49MB]
- 群星《湮灭之潮 《明日之后》蓝潮资料片游戏原声带》[FLAC/分轨][232.82MB]