QTreeWidgetで1列の水平スクロールバーを適切に表示する方法

こんにちは、Habr。







この記事では、 QtクロスプラットフォームフレームワークのGUIコンポーネントであるQTreeWidgetの不可解な動作の問題の解決策を残すことにしました。 問題は多くのフォーラムで質問されていますが、適切な解決策が示されていないため、問題は関連しているようです。 しかし、私が間違えた場合、UFOはこれを私に知らせます。







問題



Qtには、ツリーに情報を表示するために設計されたQTreeWidgetコンポーネントがあります。 ツリーの要素またはノードは、画像付きテキストまたは別のウィジェットにすることができます。







このコンポーネントの操作中に、一部のユーザーは、要素またはノードのテキストがウィジェットの幅に収まらない場合に問題が発生します。コンポーネントでは、ユーザーがテキスト全体を読むことができるようにコンテンツを左右にスクロールできません。 代わりに、テキストの最後に楕円が表示されます。 この問題は、ウィジェットが1つの列または複数の列で使用される場合に発生します(最後の列で問題が発生します)。







QTreeWidgetクラスまたはその祖先のプロパティでは、列表示領域の自動サイズ変更を有効にすることはできません。 それで、もしあなたがこの誤解に遭遇したなら、猫をお願いします。







シンプルなソリューション



QTreeWidgetのドキュメントを読んだとき、解決策が頭に浮かびました。 解決策は、次の方法(スロット)を使用することです。







void QTreeView::resizeColumnToContents(int column);
      
      





ご想像のとおり、このメソッドは列のサイズ(パラメーターとして渡される数)をコンテンツのサイズに「調整」します。 コンポーネント自体がそれを行うべきであるが、そうではない。







アプリケーションソリューション



ウィジェットを作成した直後に問題が発生した場合(つまり、ユーザーがまだ何もする時間がなく、テキストが収まらなくなった場合)、ウィジェットコンストラクターで、このメソッドを使用してすべての列に対してループを実行できます(最後までのみ)。







 //    for(int i = 0; i < treeWidget->columnCount(); ++i) treeWidget->resizeColumnToContents(i); //     treeWidget->resizeColumnToContents(treeWidget->columnCount() - 1);
      
      





ノードを展開または最小化した後、代わりに(またはこれとともに)列のサイズを変更する必要がある場合は、次のイベント(信号)を使用する必要があります。







 void QTreeView::expanded(const QModelIndex &index); //  void QTreeView::collapsed(const QModelIndex &index); // 
      
      





これらの信号に応答して接続するために自分でスロットを作成するか、フォームでワンクリックですべてを生成する必要があります(フォーム上のウィジェットの「RMB」、「スロットに移動」、スロットを選択)。







いずれにせよ、イベント応答スロットには、既知のメソッドの呼び出しのみが含まれます。







 void MainWindow::on_tree_widget_expanded(const QModelIndex &index) { treeWidget->resizeColumnToContents(index.column()); } void MainWindow::on_tree_widget_collapsed(const QModelIndex &index) { treeWidget->resizeColumnToContents(index.column()); }
      
      





ここで、 index.column()は、イベントが発生した列の番号をメソッドに伝えます。







まとめ



このように 松葉杖 簡単な方法で、QTreeWidgetコンポーネントにできることを教えることができます。 このソリューションが誰かに役立つことを願っています。 コメントで質問に答えてうれしいです。 ご清聴ありがとうございました。








All Articles