【问题标题】:How to iterate through a dynamically created list of checkboxes created with QStandardItemModel?如何遍历使用 QStandardItemModel 创建的动态创建的复选框列表?
【发布时间】:2020-03-21 10:48:52
【问题描述】:

我正在创建一个应用程序,我需要在其中制作一个清单,其中包含另一个班级给我的清单。用户将选中他们想要的项目旁边的复选框,然后单击一个按钮。对于那些被检查的行,我想打印“你检查了数字___”。在相邻的 QBoxGroup 的 QLabel 中。

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

如果用户使用 QLabel 选中多个框,我也不确定如何打印多个语句。我可能不得不让用户一次只能选择一行,但这比上面的问题要小。

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() 函数返回TypeError: 'QStandardItemModel' object is not callable

我已经尝试了这些 StackOverflow 页面上的信息,但我似乎无法弄清楚如何查看行的名称以及是否检查了该行:

【问题讨论】:

  • 错字:将model2 = self.model()更改为model2 = self.model
  • @eyllanesc 可以迭代;谢谢!!现在,我无法检查项目的名称并进行比较。当我单击该按钮时,它会遍历所有语句并到达“else”语句并打印“您没有检查任何内容”。你知道如何在迭代时获取项目的名称吗?
  • 你检查我的答案了吗?

标签: python pyqt pyqt5 qstandarditemmodel


【解决方案1】:

正如我在 cmets 中指出的那样,您有一个类型,因为您有一个名为 self.model 的属性,但您想使用 self.model() 进行访问。

另一方面,您的逻辑不正确,例如,它没有定义为row,另一方面,假设此错误不存在并且您使用您正在编写的逻辑检查了 2 个选项“您检查数字 X”,然后将其替换为“您检查数字 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")

【讨论】:

  • 在修复 model() 错字后,我意识到“行”错字。我复制并粘贴了一些其他代码并忘记更改它。太感谢了!!它有效!
  • @DoingMyBest10101 如果你想学习编程,不仅要做一个愚蠢的复制粘贴,而且你必须学会​​问自己 为什么用户 X 做了这样的事情而不是别的事情?
  • @DoingMyBest10101 item == "One" 也没有任何意义,因为 item 是 QStandardItem 而 "One" 是字符串,因此无法比较这两个元素。
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 2012-06-18
  • 2016-06-16
  • 1970-01-01
  • 2021-03-31
  • 2021-07-16
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多