1

少し難しい問題があります。これを想像してください:

私のアプリケーションの 1 つはスクリプトを多用する必要があるため、ユーザーがスクリプト スニペットを記述し、それらをディレクトリのようなツリー構造に編成する方法を提供することを考えました。これは、サブディレクトリとソース ファイルを含むソース コード ディレクトリによく似ています。

データクラス/保存

最初に遭遇する問題は、ツリー構造全体を (ディスク上および実行時にアプリケーション内に) 格納するための適切な方法を見つける必要があるということです。このために、私はこれらのアイデアを持っていました:

  1. QObject の親子機能を使用してツリーを表すことができる QObject 派生クラスを使用します。このようにして、親が削除された場合にそれらのオブジェクトを削除することを心配する必要はありません。
  2. 子の QList (ポインターなし) と、各グループ/スクリプトのプロパティを格納するいくつかのプロパティを含む単純なクラスを使用します。
  3. アプローチ#2を使用しますが、静的オブジェクトの代わりにポインターを使用します-これにより、グループまたはツリーの一部を関数などに渡す必要がある場合に無駄なコピーを回避できます.
  4. SQLite (または同様の) データベースへのライブ バックエンドを使用し、実行時にクエリを実行します。これにより、ツリー全体を一度にロードして RAM に保持することを回避できます。
  5. ファイル システムでフラットなファイルとディレクトリ構造を使用します。ただし、オブジェクトに関するメタ情報を保存する方法がないため、必要以上に問題が発生すると思います。

編集者

次に遭遇する問題は、ユーザーがおそらくツリー構造全体を編集したいという事実です。彼は、グループまたはスクリプトをクリックして、スクリプト コードを編集し、場合によってはディレクトリとスクリプトをツリー内でドラッグ アンド ドロップしたいと考えています。したがって、途中でツリー全体の構造を変更します。

これにより、次の問題が発生します。

  1. ユーザーがエディターを閉じた場合は、「変更を保存しますか?」という質問をユーザーに提供することをお勧めします。ダイアログ。誤って既存のドキュメントに何かを入力したテキスト エディターによく似ていますが、変更を保存せずに終了します。- これには、ツリー全体のコピーを編集し、必要に応じてアプリケーション内の既存のツリーを上書きする必要があります。
  2. ドラッグ&ドロップを許可すると問題が発生する可能性があります...
    • ...保存方法 #1 : 現在、QObjects の子の順序を変更する良い方法はありません。また、プログラムの他の部分がオブジェクトにアクセスする可能性があるときに、実行時にオブジェクトを移動することはお勧めできません。
    • ...これは、アプローチ #2 を格納する方が簡単です。ツリー全体が単一の値のように処理され、移動して再親化する必要がある子がないためです。ツリーの一部をコピーすると、すべての子などが自動的にコピーされます。残念ながら、これは多くのオーバーヘッドと柔軟性の損失を意味します (何が正確に変更されたかわからないため、ツリー全体をディスクに再度書き込む必要があります)。

もっと多くのことが頭に浮かんだら、おそらくこの質問を少し更新しますが、他の人がこの問題をどのように解決するのか本当に興味があります. 任意の提案やアイデアをいただければ幸いです。:)

4

2 に答える 2

2

QFileSystemModel を参照して、適切なプラクティスを確認することをお勧めします。モデルは、UI の応答性のために別のスレッドを使用してそれ自体を更新し、キャッシュを保持する必要があります。適切に動作するモデルは、エディターでの作業も容易にするはずです。

また、TreeItem クラスを作成するために QObject を派生させたいと思います。基本クラスの QSharedData を使用した共有データのアプローチはいいでしょう。私はそれの注文のためのプロパティも持っています。このようにして、ユーザーがドラッグ アンド ドロップしたり、他の方法で順序を変更したりするときに、制御を維持する方法があります。データは共有されるため、パフォーマンスのためにオブジェクトの独自のリストを保持しても、コストはほとんどかかりません。

また、ModelTestを見てください。

于 2009-12-11T01:23:57.573 に答える
0

ここまでで、専用クラスを使用してツリーの深さを制限することで問題を解決しました。つまり、処理する必要があるツリーの深さは限られているので、今のところ、QTreeTreeWidget と、並べ替え、ドラッグ アンド ドロップ、およびその他の優れた機能を可能にするいくつかのヘルパー メソッドを使用するだけです。

于 2009-12-20T15:42:14.723 に答える