【问题标题】:PyQt: How to connect a QStandardItem in a QStandardItemModel to a functionPyQt:如何将 QStandardItemModel 中的 QStandardItem 连接到函数
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 嗨@waterboy5281 我有一个后续问题。如果我想将另一个参数传递给 state_changed 函数,我知道我可以通过以下方式添加:list_view.clicked.connect(state_changed(newparam))。但是现在我将如何传递索引?
  • list_view.clicked.connect(lambda idx: state_changed(idx, new_param))。并确保 state_changed 被修改为接受两个参数
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多