2017-03-01 40 views
1

我在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

回答

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

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

相關問題