1

私が開発したプログラムからメソッドを最適化しようとしています。

基本的に、これは情報を表示する 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 つのインデックスのみを「リロード」する方法があるのだろうか?

4

2 に答える 2

1

おそらくこれが役立ちます:

と:

index = table.model().index(line, 12)
table.model().dataChanged.emit(index,index)

また:

table.model().dataChanged.emit(table.model().index(line, 12),table.model().index(line, 12))

変更の影響を受ける項目を定義できますドキュメントを参照してください。

-signaltable.model().dataChangedによる自動更新または再描画table.model.setData()は、左上と右下の子を表す 2 つのインデックスによって定義される領域に制限する必要があります。両方のインデックスが同じ場合、1 つのアイテムのみが影響を受けます。

于 2015-04-16T18:30:56.227 に答える
0

QSqlTableModelとても便利ですが、魔法ではありません。私の推測では、更新ステートメントの実行にほとんどの時間がかかります。いくつかの行を手動で更新してみて、それがどれくらいかかるかを確認してください。

これも遅い場合は、sqlite がより迅速に行を検索できるように、おそらくテーブルにインデックスが必要です。

于 2015-04-17T10:05:19.773 に答える