ディレクトリのようなツリー構造を保存および編集(GUI)する最もエレガント/安全/簡単なソリューション?

StackOverflow https://stackoverflow.com/questions/1882666

質問

解決すべき少しトリッキーな問題があります。これを想像してみてください:

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

データクラス/保存

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

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

編集者

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

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

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

もっと物事が私の頭に浮かぶとき、私はおそらくこの質問を少し更新しますが、他の人がこの問題をどのように解決するのか本当に興味があります。どんな提案やアイデアが高く評価されています。 :)

役に立ちましたか?

解決 2

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

他のヒント

良い実践のためにQfilesystemModelを見ることをお勧めします。モデルは、UIの応答性のために別のスレッドを使用して、キャッシュを維持するなどを使用して自らを更新する必要があります。適切に動作したモデルは、エディターでの作業を容易にする必要があります。

また、TreeITEMクラスを作成するためにQoBjectを導き出すために行きます。基本クラスのQsharedDataを使用して共有されたデータをaproachするのがいいでしょう。また、注文の財産もあります。これにより、ユーザーが他の方法で順序をドラッグおよびドロップまたは変更すると、制御を維持する方法があります。データは共有されているため、パフォーマンスのためにオブジェクトの独自のリストを維持することはほとんどコストになりません。

また、見てください モデルテスト.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top