2017-03-01 8 views
1

私はQStandardItemModelとQStandardItemを使って作成したチェックボックスのリストを持つPyQtでアプリケーションを作成しています。私はリストの最初の項目を 'Select all'チェックボックスを関数に接続したいと思います。この関数は、リストの他のすべての項目をチェックできるはずです。私は、次のコードでこれをやろうとしている:私は、SQLクエリの出力から、リストに複数の項目を追加した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") 

と私はそのボックスをチェックかかわらず、印刷された「こんにちは」ことがわかりますIクリック。

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引数があります。最も簡単な方法は、item引数が必要な項目であるかどうかをチェックすることです。今では、スコープの問題を抱えています(あなたはどこにでもあなたの望むアイテムを保存しないので、別の場所でテストすることができます)。私はあなたがクラス内で実装を行い、あなたのターゲットアイテムをクラスの変数にするべきだと思います(これが可能になります: 'self.item == item')。 – armatita

答えて

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

こんにちは@ 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'が2つの引数を受け入れるように変更されていることを確認してください – Crispin

関連する問題