3

過去数か月に何度か投稿したので、Qtで日記/日記のアプリケーションを書いています。エントリは、QTreeWidgetで年、月、日、およびエントリ(エントリを日で並べ替えるデフォルトの構成)または年、月、およびエントリ(同じ月のすべてのエントリがグループ化される)で並べ替えられます。

エントリノードには2つの列があります。最初の列は表示され、エントリ名を保持します。2番目の列は非表示で、データベース内の対応するエントリの行番号を保持します。そのエントリが選択されると、プログラムはその行番号に基づいて選択クエリを実行し、コンテンツを表示します。ルート、年、月、(および有効な場合は日)ノードにも2番目の列がありますが、それらの行番号は常に-1です。(有効な行数は0から始まります)

ジャーナルツールバーには、ユーザーが次のエントリと前のエントリを表示できるようにする戻るボタンと進むボタンがすでにあります。この関数はすでに機能していますが、ツリーで現在選択されている項目は変更されません。これを修正しようとしています。

これを行う最良の方法は、正しい行番号が見つかるまで、それぞれの2番目の非表示列の値をスキャンするループ関数であると判断しました。戻る/進むボタンをクリックするたびにこの関数が再度呼び出されるため、これが機能するようになると、選択したノードは常に表示されている現在のエントリと一致します。

欠点は、データベースが巨大になるとこの方法が遅くなる可能性があることですが、それについて私ができることはあまりありません。ユーザーはエントリを削除したり、シャッフルしたりする可能性があるため、rownumber++またはrownumber--に依存するだけで問題が発生する可能性があります。データベースは欠落している行番号を入力せず、次の行番号に進むだけなので、データベースでこれまでに作成されたすべての行が常に存在するとプログラムが常に想定している場合、問題が発生する可能性があります。

私の質問は、QTreeWidgetのすべてのノードの特定の列をスキャンするにはどうすればよいですか?

4

1 に答える 1

14

すべてのアイテムの反復は、次の方法で実行できます。

QTreeWidgetItemIterator it(treewidget);
while (*it) {
  if ((*it)->text(column_number)=="searched")
    break;
  ++it;
}

しかし、おそらくQTreeWiget :: findItems()がまさに必要なものです。

QStandardItem :: data()も見てください。これは、非表示の列と比較して、アイテムごとの非表示のデータを格納するためのより良い方法です。

于 2012-01-07T23:42:07.007 に答える