如何遍历使用 QStandardItemModel 创建的动态创建的复选框列表?

How to iterate through a dynamically created list of checkboxes created with QStandardItemModel?

我正在创建一个应用程序,我需要用另一个 class 给我的清单来制作清单。用户将选中他们想要的项目旁边的复选框,然后单击一个按钮。对于那些被选中的行,我想在相邻的 QBoxGroup 的 QLabel 中打印 "You checked number ___."。

(在我的实际应用程序中,我正在遍历 classes,我将在 class 中调用一个函数)。我很难遍历我的列表,因为我必须检查该框是否被选中以及名称是否是我想要打印的名称(打印的语句与实际名称不同,因为在我的应用程序中我将在 class 我所在的行中调用一个函数。

我也不确定如何在用户使用 QLabel 选中多个框的情况下打印多个语句。我可能必须让用户一次只能 select 一行,但这是一个比上面那个小的问题。

from PyQt5.QtWidgets import (QApplication, QTabWidget, QVBoxLayout, QWidget, QGridLayout, QLabel, QGroupBox,
                             QListView, QPushButton)
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtCore import Qt
import sys, os

class MyPage(QWidget):
    def __init__(self):

        super().__init__()
        self.app = QApplication(sys.argv)
        self.screen = self.app.primaryScreen()
        self.size = self.screen.size()
        self.mydata = None

        # These numbers are arbitrary and seemed
        # to have the best balance
        self.textWidth = self.size.width() * 0.64
        self.chooseWidth = self.size.width() * 0.29

        self.createTextGroup()
        self.createStatsGroup()

        self.layout = QGridLayout()
        self.layout.addWidget(self.TextGroup, 0, 0, 0, 1)
        self.layout.addWidget(self.StatsGroup, 0, 1)
        self.setLayout(self.layout)
        self.show()

    # The left side of AnalysisTab containing the textbox
    # where the analysis will be shown
    def createTextGroup(self):
        self.TextGroup = QGroupBox("Analysis")
        self.TextGroup.setFixedWidth(self.textWidth)
        self.setStyleSheet("font: 15pt Tw Cen MT")

        # Here is where the analysis will go
        self.analysis = QLabel()

        self.layout = QGridLayout()
        self.layout.addWidget(self.analysis)
        self.TextGroup.setLayout(self.layout)

    # The right side of AnalysisTab containing a checklist of tests that
    # may be run on the data and a button to press to run the tests
    def createStatsGroup(self):
        self.StatsGroup = QGroupBox("Statistics Tests")
        self.StatsGroup.setFixedWidth(self.chooseWidth)
        self.setStyleSheet("font: 15pt Tw Cen MT")

        # List widgets where users will choose what analysis
        # they would like ran on their data
        self.statsAnalysis = QListView()
        self.model = QStandardItemModel(self.statsAnalysis)

        for member in myList(self):
            item = QStandardItem(member)
            item.setCheckable(True)
            check = Qt.Unchecked
            item.setCheckState(check)
            self.model.appendRow(item)

        self.statsButton = QPushButton("Analyze")
        self.statsButton.clicked.connect(self.statsButtonClicked)

        self.statsAnalysis.setModel(self.model)
        self.layout = QGridLayout()
        self.layout.addWidget(self.statsAnalysis, 0, 0, 0, 1)
        self.layout.addWidget(self.statsButton, 1, 1)
        self.StatsGroup.setLayout(self.layout)

    def statsButtonClicked(self):
        model2 = self.model
        for index in range(model2.rowCount()):
            item = model2.item(index)
            if item.checkState() == Qt.Unchecked and item == "One":
                self.analysis.setText("You checked number 1")
            elif item.checkState() == Qt.Unchecked and item == "One":
                self.analysis.setText("You checked number 2")
            elif item.checkState() == Qt.Unchecked and item == "One":
                self.analysis.setText("You checked number 3")
            elif item.checkState() == Qt.Unchecked and item == "One":
                self.analysis.setText("You checked number 4")
            elif item.checkState() == Qt.Unchecked and item == "One":
                self.analysis.setText("You checked number 5")
            else:
                self.analysis.setText("You didn't check anything")

def myList(self):
    thisList = ["One", "Two", "Three", "Four", "Five"]
    return thisList

def runStatsWiz():
    app = QApplication(sys.argv)
    myPage = MyPage()
    myPage.show()
    app.exec_()


runStatsWiz()

现在,statsButtonClicked() 函数 returns TypeError: 'QStandardItemModel' object is not callable

我试过这些 Whosebug 页面上的信息,但我似乎无法弄清楚如何查看行的名称以及是否选中了该行:

正如我在评论中指出的那样,你有一个类型,因为你有一个名为 self.model 的属性,但你想使用 self.model().

进行访问

另一方面,你的逻辑是不正确的,因为例如它没有定义它是 row,另一方面,假设这个错误不存在并且你有 2 个选项检查了你的逻辑你正在写 "You checked number X",然后将其替换为 "You checked number Y"。

逻辑是将选中项的文本保存在一个列表中,如果该列表不为空则拼接信息,否则表示没有选中项。

def statsButtonClicked(self):
    checked_options = []
    for index in range(self.model.rowCount()):
        item = self.model.item(index)
        if item is not None and item.checkState() == Qt.Checked:
            checked_options.append(item.text())
    if checked_options:
        self.analysis.setText(
            "\n".join(["You checked number {}".format(option) for option in checked_options])
        )
    else:
        self.analysis.setText("You didn't check anything")