【发布时间】:2017-03-01 10:13:23
【问题描述】:
我正在 PyQt 中创建一个应用程序,其中有一个复选框列表,我使用 QStandardItemModel 和 QStandardItem 创建了它,它运行良好。我想将列表中的第一项“全选”复选框连接到一个函数。此功能应该能够检查列表的所有其他项目。我正在尝试通过以下代码执行此操作:
model = QStandardItemModel(list)
item = QStandardItem("Select all")
model.appendRow(item)
item.setCheckable(True)
model.itemChanged.connect(state_changed)
def state_changed(item):
print ("Hello")
我从 SQL 查询的输出中向列表中添加了更多项目,并且无论我单击哪个复选框,我都可以看到打印了“Hello”。这是我的全部代码:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSql import *
def main():
db = QSqlDatabase.addDatabase("QODBC")
db.setHostName('LAPTOP-B79DRPA3')
db.setDatabaseName('local')
db.open()
if (db.open()==False):
QMessageBox.critical(None, "Database Error",
db.lastError().text())
query = QSqlQuery ()
query.exec_ ("select id from [Sarah].[dbo].fraga")
list = QListView()
model = QStandardItemModel(list)
item = QStandardItem("Select all")
model.appendRow(item)
item.setCheckable(True)
model.itemChanged.connect(state_changed)
while (query.next()):
item1 = QStandardItem(str(query.value(0)))
model.appendRow(item1)
item1.setCheckable(True)
list.setModel(model)
list.show()
return app.exec_()
def state_changed(item):
print ("Hello")
if __name__ == '__main__':
app = QApplication(sys.argv)
list = QListView()
model = QStandardItemModel(list)
main()
如何确保仅在“全选”状态发生更改时才调用该函数?
【问题讨论】:
-
您已将
state_changed函数连接到模型的itemChanged信号。在您自己的实现中,state_changed有一个 item 参数。最简单的方法是检查 item 参数是否是您需要的项目。现在您将遇到范围问题(您没有将所需的项目保存在任何地方,因此可以在另一个地方进行测试)。我认为你应该在一个类中实现你的实现,并使你的目标项成为类的变量(所以这成为可能:self.item == item)。
标签: python pyqt qstandarditemmodel qstandarditem