我在确定用户是否已在我创建的简单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检测项目的时间并将其连接到函数,但它无法区分季节。
答案 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))