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() 

如何确保仅在“全选”状态发生更改时调用该函数?

+0

您已将'state_changed'函数连接到模型的'itemChanged'信号。在你自己的实现中'state_changed'有一个item参数。最简单的方法是检查项目参数是否是您需要的项目。现在你将遇到一个范围问题(你没有把你想要的物品保存在任何地方,因此可以在另一个地方进行测试)。我认为你应该在一个类内部实现你的实现,并将你的目标项目变成一个类的变量(所以这成为可能:'self.item == item')。 – armatita

而不是连接到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() 
+0

Hi @ waterboy5281我有一个后续问题。如果我想传递另一个参数到state_changed函数,我知道我可以通过以下方式添加:list_view.clicked.connect(state_changed(newparam))。但是现在我将如何通过索引? – Sarah

+0

'list_view.clicked.connect(lambda idx:state_changed(idx,new_param))'。并确保'state_changed'被修改为接受两个参数 – Crispin