在PyQt5中访问动态创建的QStandardItems的属性

时间:2016-09-26 03:03:52

标签: python pyqt pyqt5

我在确定用户是否已在我创建的简单GUI中检查或取消选中动态创建的复选框时遇到问题。

我已经调整了相关代码并粘贴在下面。虽然创建和命名4个QStandardItems可能很容易,但我正在处理许多包含许多不同项目的列表,这些项目会发生很大变化,因此自己创建它们并不是真的可行。

任何有助于了解如何访问这些属性的帮助都将非常感激。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class Splash(QWidget):
    def __init__(self):
        super().__init__()

        # imagine this is a very long list...
        self.seasons = ['summer','autumn','winter','spring']

        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        list = QListView()
        model = QStandardItemModel()
        list.setModel(model)

        printbtn = QPushButton('print values')
        printbtn.clicked.connect(self.print_action)

        for season in self.seasons:
            item = QStandardItem(season)
            item.setCheckable(True)
            model.appendRow(item)

        model.dataChanged.connect(lambda: self.print_action(item.text()))


        layout.addWidget(printbtn)
        layout.addWidget(list)

        self.setLayout(layout)
        self.show()

    def print_action(self, item):
        print('changed', item)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = Splash()
    sys.exit(app.exec_())

简而言之 - 我可以使用model.dataChanged检测项目的时间并将其连接到函数,但它无法区分季节。

2 个答案:

答案 0 :(得分:0)

似乎您希望在更改项目的checkState时收到通知。

在我看来,可能有两种方式。

首先,QModel将发出" dataChanged"刷新视图,这样就可以连接信号,这意味着项目的checkState可能会被更改。

model.dataChanged.connect(self.test)

def test(self):
    pass

第二种方式,使用计时器通知你自己,你自己检查一下。

timer = QTimer()
timer.timeout.connect(self.test)
timer.start(1000) 

答案 1 :(得分:0)

如果您保留对列表(或模型)的引用,您可以按文本搜索项目,然后获取其检查状态:

def print_action(self):
    model = self.list.model()
    for text in 'summer', 'autumn', 'winter', 'spring':
        items = model.findItems(text)
        if items:
            checked = items[0].checkState() == Qt.Checked
            print('%s = %s' % (text, checked))