2016-08-28 9 views
0

初心者の質問があります。 Model-View-Controllerの設計パターンを正しく理解しているかどうかはわかりません。ファイル全体をQStandardItemModelに読み込んだ後でQTableViewを更新する

多分、私の問題の説明から始めます。私はファイルからいくつかのデータを読んでいます。これは10秒後に私はそれらのデータをテーブルに提示すると言うことができます。問題はそれらのデータをどのように保存すべきかということです。 QStandardItemModel以外にも、ファイルからデータを読み込んで別のスレッドで使用する別のコンテナを用意する必要がありますか?たとえば、GuiスレッドにQStandardItemModelがあります。別のコンテナを作成して、QVectorとしましょう。ファイルのデータをQVectorにロードしてから、QVectorからQStandardItemModelにデータを移動しますか?

私が知っているようQStandardItemModelappendRow後のビューを更新するための信号を発するので、私はGUIがフリーズするので、他のスレッドでQStandardItemModelを使用してQStandardItemModelにファイルから直接データを読み取ることができません。

または、カスタムモデルを作成して、ファイル全体がQStandardItemModelにロードされたときにのみビューを更新する方法を追加する必要がありますか? QTableViewにはデータ用の独自のコンテナがあり、モデルと同期されていませんか?それは可能か正しい方法ですか?

新しいファイルを読み込んだ場合はどうなりますか?

ありがとうございました。

+0

ファイルからデータを1回だけロードするか、何度かロードしますか? –

+0

ええ、複数です。唯一の場合は、QStandardItemModelをGUIと読み取りファイルスレッドの間で共有できると思います。 新しいファイルを読むときは、新しいデータだけをモデルに記入したいと思います。私はファイルを読むたびに新しいモデルを設定することを考えていましたが、それはすばらしい効率的な解決策ではないと思います。 btw。その場合、古いQStandardItemModelからメモリを削除する方法はありますか? – Cherubim

+0

ファイルをモデルに読み込むために* 10秒*かかると、非常に大きな**行数/列数があると思います。 'QStandardItemModel'でそれらを一度にロードすることはお勧めしません。' QAbstractItemModel'、['canFetchMore'](https://doc.qt.io/qt-5/qabstractitemmodel.html#canFetchMore)を使っていくつかの遅延読み込みを行います。 、['fetchMore'](https://doc.qt.io/qt-5/qabstractitemmodel.html#fetchMore)。これは、[QSqlQueryModel'](https://code.qt.io/cgit/qt/qtbase.git/tree/src/sql/models/qsqlquerymodel.cpp#n190)で内部的に使用される戦略であることに注意してください。大きい*モデル。 – Mike

答えて

0

私はあなたの問題を解決するため、このような手順を行うことができると思います。

  1. あなたがnullptrであなたのQTableViewのためのモデルを設定ファイルから新しいデータをロードする必要がある場合。
  2. ファイルのデータを持つ非メイン(非GUI)スレッドのQStandardItemModel(このモデルはQTableViewのモデルでした)を入力してください。
  3. メイン(GUI)スレッドでQTableViewのデータを含むモデルを設定します。もちろん

、あなたの問題を解決する最も簡単な方法は、また、このようなユーザの何かを表示するようになることがありますが、メイン(GUI)スレッド内QStandardItemModelにデータをロードしながら、「データのロード、...お待ちください」 。

関連する問題