PyQt:如何将QStandardItemModel中的QStandardItem连接到函数中
问题描述:
我在PyQt中创建了一个应用程序,其中我有一个使用QStandardItemModel和QStandardItem创建的复选框列表,它完美地工作。我想将列表中的第一个项目连接到一个“全选”复选框。这个功能应该能够检查列表中的所有其他项目。我想通过下面的代码来做到这一点: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查询的输出,我可以看到“你好”印刷不管是哪个的复选框我单击。这是我的全部代码:
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()
如何确保仅在“全选”状态发生更改时调用该函数?
答
而不是连接到QAbstractItemModel.itemChanged
信号,连接到QAbstractItemView.clicked
信号,它指定单击的索引。此外,建议不要命名变量list
,因为它会干扰内置的list
。
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_view = QListView()
model = QStandardItemModel(list_view)
item = QStandardItem("Select all")
model.appendRow(item)
item.setCheckable(True)
list_view.clicked.connect(state_changed)
while (query.next()):
item1 = QStandardItem(str(query.value(0)))
model.appendRow(item1)
item1.setCheckable(True)
list_view.setModel(model)
list_view.show()
return app.exec_()
def state_changed(index):
row = index.row()
if row == 0:
print ("Hello")
if __name__ == '__main__':
app = QApplication(sys.argv)
list_view = QListView()
model = QStandardItemModel(list)
main()
您已将'state_changed'函数连接到模型的'itemChanged'信号。在你自己的实现中'state_changed'有一个item参数。最简单的方法是检查项目参数是否是您需要的项目。现在你将遇到一个范围问题(你没有把你想要的物品保存在任何地方,因此可以在另一个地方进行测试)。我认为你应该在一个类内部实现你的实现,并将你的目标项目变成一个类的变量(所以这成为可能:'self.item == item')。 – armatita