Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5可检查组合框:显示已检查项的列表_Python_Pyqt_Pyqt5_Qcombobox - Fatal编程技术网

Python PyQt5可检查组合框:显示已检查项的列表

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

基于可检查组合框的实现,我想更进一步,能够直接在主QComboBox标签上显示选中项目的列表,即当QComboBox的显示文本未展开时

到目前为止,我能够打印选中项目的列表,但我不知道如何使用前者更改主QComboBox标签文本:

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徽章-谢谢你的提示:我确实删除了那条线^^