Python PyQt5可检查组合框:显示已检查项的列表
基于可检查组合框的实现,我想更进一步,能够直接在主QComboBox标签上显示选中项目的列表,即当QComboBox的显示文本未展开时 到目前为止,我能够打印选中项目的列表,但我不知道如何使用前者更改主QComboBox标签文本:Python PyQt5可检查组合框:显示已检查项的列表,python,pyqt,pyqt5,qcombobox,Python,Pyqt,Pyqt5,Qcombobox,基于可检查组合框的实现,我想更进一步,能够直接在主QComboBox标签上显示选中项目的列表,即当QComboBox的显示文本未展开时 到目前为止,我能够打印选中项目的列表,但我不知道如何使用前者更改主QComboBox标签文本: from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow, QWidget, QVBoxLayout from PyQt5.QtGui import QStandardItemModel from
from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow, QWidget, QVBoxLayout
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import Qt
import sys
class CheckableComboBox(QComboBox):
def __init__(self):
super(CheckableComboBox, self).__init__()
self.view().pressed.connect(self.handle_item_pressed)
self.setModel(QStandardItemModel(self))
def handle_item_pressed(self, index):
item = self.model().itemFromIndex(index)
if item.checkState() == Qt.Checked:
item.setCheckState(Qt.Unchecked)
# print(item.text() + " was unselected.")
else:
item.setCheckState(Qt.Checked)
# print(item.text() + " was selected.")
self.check_items()
def item_checked(self, index):
item = self.model().item(index, 0)
return item.checkState() == Qt.Checked
def check_items(self):
checkedItems = []
for i in range(self.count()):
if self.item_checked(i):
checkedItems.append(self.model().item(i, 0).text())
print(checkedItems)
class Dialog_01(QMainWindow):
def __init__(self):
super(QMainWindow, self).__init__()
myQWidget = QWidget()
myBoxLayout = QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.ComboBox = CheckableComboBox()
for i in range(3):
self.ComboBox.addItem("Combobox Item " + str(i))
item = self.ComboBox.model().item(i, 0)
item.setCheckState(Qt.Unchecked)
myBoxLayout.addWidget(self.ComboBox)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480, 320)
sys.exit(app.exec_())
说明我想要什么的图片:
您可以覆盖paintEvent方法: 类CheckableComboxQComboxBox: 定义初始自我: 超级复选框,自初始化__ self.view.pressed.connectself.handle\u项目\u pressed self.setModelQStandardItemModelself def handle_item_pressed self,索引: item=self.model.itemFromIndexindex 如果item.checkState==Qt.Checked: item.setCheckStateQt.Unchecked 其他: item.setCheckStateQt.Checked def项目_检查自身,索引: item=self.model.itemindex,0 return item.checkState==Qt.Checked def检查项目自身: checkedItems=[] 对于rangeself.count中的i: 如果self.item_checkedi: checkedItems.appendself.model.itemi,0.text 返回支票 def paintEventself,事件: painter=QStylePainterself painter.setPenself.palete.colorqpalete.Text opt=QSTYLEOPTIONCOMBOX self.initStyleOptionopt opt.currentText=,.joinself.check_项 painter.drawComplexControlQStyle.CC_组合框,可选 painter.drawControlQStyle.CE_组合框标签,可选
可以重写paintEvent方法: 类CheckableComboxQComboxBox: 定义初始自我: 超级复选框,自初始化__ self.view.pressed.connectself.handle\u项目\u pressed self.setModelQStandardItemModelself def handle_item_pressed self,索引: item=self.model.itemFromIndexindex 如果item.checkState==Qt.Checked: item.setCheckStateQt.Unchecked 其他: item.setCheckStateQt.Checked def项目_检查自身,索引: item=self.model.itemindex,0 return item.checkState==Qt.Checked def检查项目自身: checkedItems=[] 对于rangeself.count中的i: 如果self.item_checkedi: checkedItems.appendself.model.itemi,0.text 返回支票 def paintEventself,事件: painter=QStylePainterself painter.setPenself.palete.colorqpalete.Text opt=QSTYLEOPTIONCOMBOX self.initStyleOptionopt opt.currentText=,.joinself.check_项 painter.drawComplexControlQStyle.CC_组合框,可选 painter.drawControlQStyle.CE_组合框标签,可选
只需对原始代码稍作更改,即可轻松实现以下代码。打开“组合框”选项卡时,您将看到所有项目标签都更新为当前选定的选项 例如: 如果选择了所有选项,您将得到以下结果: 组合框项目0-所选项目:0、1、2 或 例如,如果删除了选项0: 组合框项目2-所选项目:1、2 守则: def检查项目自身: checkedItems=[] 对于rangeself.count中的i: 如果self.item_checkedi: 附录检查 self.update_标签checkeditems def更新标签自身,项目列表: n= 计数=0 对于项目清单中的i: 如果计数=0: n+='%s'%i 其他: n+=,%s'%i 计数+=1 打印'n:%s'。%n 对于rangeself.count中的i: text\u label=self.model.itemi,0.text 打印“当前索引%s文本\u标签%s”%i,文本\u标签 sys.stdout.flush 如果text_label.find'-'>=0: text_label=text_label.split'-'[0] 项目\新建\文本\标签=文本\标签+'-所选项目:'+n self.model.itemi.setTextitem\u新建\u文本\u标签 已更正self.setItemTexti、item_new_text_标签复制/粘贴错误。 打印项目列表 sys.stdout.flush
只需对原始代码稍作更改,即可轻松实现以下代码。打开“组合框”选项卡时,您将看到所有项目标签都更新为当前选定的选项 例如: 如果选择了所有选项,您将得到以下结果: 组合框项目0-所选项目:0、1、2 或 例如,如果删除了选项0: 组合框项目2-所选项目:1、2 守则: def检查项目自身: checkedItems=[] 对于rangeself.count中的i: 如果self.item_checkedi: 附录检查 self.update_标签checkeditems def更新标签自身,项目列表: n= 计数=0 对于项目清单中的i: 如果计数=0: n+='%s'%i 其他: n+=,%s'%i 计数+=1 打印'n:%s'。%n 对于rangeself.count中的i: text\u label=self.model.itemi,0.text 打印“当前索引%s文本\u标签%s”%i,文本\u标签 sys.stdout.flush 如果text_label.find'-'>=0: text_label=text_label.split'-'[0] 项目\新建\文本\标签=文本\标签+'-所选项目:'+n self.model.itemi.setTextitem\u新建\u文本\u标签 已更正self.setItemTexti、item_new_text_标签复制/粘贴错误。 打印项目列表 sys.stdout.flush
到目前为止,我能够打印选中项目的列表,但我不知道如何使用前者更改主QComboBox标签文本,这是什么意思?当您从下拉菜单中勾选复选框时,列表顺序的外观是否应该改变?如果你更容易理解的话,你可以画一张图片,并通过更新它将其添加到你的问题中。谢谢你的反馈:我上传了一张解释性图片。我希望现在更清楚一点:@rubebop我发现把另一个问题标记为正确是矛盾的,也许我误解了你的问题。据我所知,QComboBox标签将显示选中项目的文本,这是我的解决方案所做的,与其他解决方案不同,该解决方案每次选择或取消选择项目时都会创建一个新项目,假设你有1000个,那么你会有很多不可检查的选项,而不是少数几个可检查的选项。@ZF007请不要添加不必要的标记,这里python3没有relevance@eyllanesc复制/粘贴错误问题。现在已经修好了。我确实添加了py3.x,因为print语句结构显示了它的py3.x。没什么大不了的。到目前为止,我可以打印选中项目的列表,但我不知道如何使用前者更改主QComboBox标签文本,这是什么意思?当您从下拉菜单中勾选复选框时,列表顺序的外观是否应该改变?如果你更容易理解的话,你可以画一张图片,并通过更新它将其添加到你的问题中。谢谢你的反馈:我上传了一张解释性图片。我希望现在更清楚一点:@rubebop我发现把另一个问题标记为正确是矛盾的,也许我误解了你的问题。据我所知,QComboBox标签将显示选中项目的文本,这是我的解决方案所做的,与其他解决方案不同,该解决方案每次选择或取消选择项目时都会创建一个新项目,假设你有1000个,那么你会有很多不可检查的选项,而不是少数几个可检查的选项。@ZF007请不要添加不必要的标记,这里python3没有relevance@eyllanesc复制/粘贴错误问题。现在已经修好了。我确实添加了py3.x,因为print语句结构显示了它的py3.x。没什么大不了的。在我正在实施的计划中,这个解决方案有一个大问题。每次运行check_items函数时,我都会记录checkItems列表。在您的解决方案中,通过将光标放在CheckableComboBox上,该函数已经自动运行,这将创建不需要的日志。如果这不是由QPushButton上通过handle_item_pressed函数的按下操作触发的,我不想运行check_items。在我正在实施的程序中,此解决方案存在一个大问题。每次运行check_items函数时,我都会记录checkItems列表。在您的解决方案中,通过将光标放在CheckableComboBox上,该函数已经自动运行,这将创建不需要的日志。如果这不是由QPushButton上通过handle_item_pressed函数的按下操作触发的,我不想运行check_items。我相信text_label.rstrip“%s”%I可以删除,因为输出未使用;这一点你是对的,你可以毫无问题地把它拿出来,或者用一个带有解释说明的标签。它可以帮助您更快地获得CopyEditor徽章-感谢您提供的提示:我确实删除了该行^^我相信text_label.rstrip“%s”%I可以删除,因为输出未使用;这一点你是对的,你可以毫无问题地把它拿出来,或者用一个带有解释说明的标签。它可以帮助您更快地获得CopyEditor徽章-谢谢你的提示:我确实删除了那条线^^