Python PyQt:如何将QStandardItemModel中的QStandardItem连接到函数
我正在PyQt中创建一个应用程序,其中有一个复选框列表,我使用QStandardItemModel和QStandardItem创建了这些复选框,它可以完美地工作。我想将列表中的第一项(即“全选”复选框)连接到函数。此函数应该能够检查列表中的所有其他项。我正试图通过以下代码实现这一点:Python PyQt:如何将QStandardItemModel中的QStandardItem连接到函数,python,pyqt,qstandarditemmodel,qstandarditem,Python,Pyqt,Qstandarditemmodel,Qstandarditem,我正在PyQt中创建一个应用程序,其中有一个复选框列表,我使用QStandardItemModel和QStandardItem创建了这些复选框,它可以完美地工作。我想将列表中的第一项(即“全选”复选框)连接到函数。此函数应该能够检查列表中的所有其他项。我正试图通过以下代码实现这一点: model = QStandardItemModel(list) item = QStandardItem("Select all") model.appendRow(item)
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()
如何确保仅当“全选”状态更改时才调用该函数 不要连接到
qabstractemmodel.itemChanged
signal,而是连接到qabstractemview.clicked
signal,它指定单击的索引。此外,建议不要将变量命名为列表
,因为它会干扰内置的列表
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\u changed
功能连接到模型的itemChanged
信号。在您自己的实现中,state\u changed
有一个item参数。最简单的方法是检查item参数是否是您需要的项。现在,您将遇到范围问题(您没有将所需项目保存在任何位置,以便在其他位置进行测试)。我认为应该在类中实现,并将目标项作为类的变量(这样就可以了:self.item==item
)。嗨@waterboy5281我有一个后续问题。如果我想向state_changed函数传递另一个参数,我知道我可以通过以下方式添加:list_view.clicked.connect(state_changed(newparam))。但是现在我如何传递索引呢?list\u view.clicked.connect(lambda idx:state\u changed(idx,new\u param))
。并确保修改state\u changed
以接受两个参数