PyQt: Как подключить QStandardItem в QStandardItemModel к функции

Я создаю приложение в 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()

Как я могу гарантировать, что функция вызывается только при изменении состояния "Выбрать все"?

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()
Другие вопросы по тегам