私が開発したプログラムからメソッドを最適化しようとしています。
基本的に、これは情報を表示する GUI (私は PyQt ライブラリを使用します) です。情報は sqlite データベースに保存されます。QSqlTableModel と QTableview を使用してこれらの情報を表示します。非常に一般的な組み合わせです。
データベース内のフィールドの 1 つは、"new" と呼ばれるブール値です。最適化したいメソッドの目的は、このブール値を 0 に設定することです。
メソッドは次のとおりです。
def markOneRead(self, element):
"""Slot to mark an article read"""
print("\n")
print("start markoneread")
start_time = datetime.datetime.now()
# Get the QTableView object (I have several)
table = self.liste_tables_in_tabs[self.onglets.currentIndex()]
# Save the current selected line
line = table.selectionModel().currentIndex().row()
print("before bdd change")
elapsed_time = datetime.datetime.now() - start_time
print(elapsed_time)
# Change the data in the model
# The 12th column is the field "new". I write 0
# !!!!! Very long action
table.model().setData(table.model().index(line, 12), 0)
print("before searchbutton")
elapsed_time = datetime.datetime.now() - start_time
出力は次のようになります。
before bdd change
0:00:00.000141
before searchbutton
0:00:03.064438
基本的に、この行:
table.model().setData(table.model().index(line, 12), 0)
実行に 3 秒かかります。それは非常に長いです。データベース内のアイテムを更新しているだけなので、それほど長くはありません。私のデータベースには 25000 個のアイテムがありますが、何かが変わるとは思いません。
編集:モデルがすぐに変更を実行し、すべてのデータをリロードしようとするためでしょうか?
この問題を解決する方法についてのアイデアはありますか?
編集2:
実際、問題はデータのリロードから発生します。モデルの editStrategy を変更すると:
model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
3 秒もかからなくなりましたが、ビューは更新されず、メソッドの呼び出し後も new は 1 に設定されています。
モデルの変更後に、1 つのアイテム、1 つのインデックスのみを「リロード」する方法があるのだろうか?