1

次のように動作するスクロール領域が必要なのは初めてではありません (ログまたはチャットウィンドウを想像してみてください。単純な QTextBrowser を使用するには複雑すぎます)。

  • 上下に表示される複数のウィジェットを追加したい (QVBoxLayout に配置したときのように)
  • このレイアウト内の各ウィジェットは、固定サイズまたは高さ対幅 (単純なラベルなど) を持つ必要があります。
  • スクロール領域は、最後に追加された領域に自動スクロールする必要があります
  • (オプション)スペースが残っている場合(スクロールバーがまだ有効になっていない場合)、コンテンツを下に揃える必要があります

QScrollArea の使用:

過去の私の試みは、内部で QVBoxLayout を使用して QScrollArea を使用していました。しかし、これは思ったほど単純ではないようです。レイアウトにウィジェットを追加するたびに、レイアウトはスクロール領域のコンテンツ ウィジェットのサイズをすぐに変更しないため、コンテンツの調整が遅れます。一瞬、レイアウトに含まれるウィジェットのサイズが変更され、合計サイズが追加操作前の合計サイズと等しくなり、ウィジェットごとのサイズが小さすぎます。また、レイアウトがそのサイズをウィジェットの新しい合計サイズに修正するまで、新しく追加されたウィジェットにスクロールすることはできません。タイムアウトが 20 程度であっても、レイアウトのサイズ変更にさらに時間がかかる場合があります。これは決定論的ではないため、優れたソリューションとはほど遠いものです。

下揃えの動作を得るために、最初にスペーサー項目をレイアウトに配置します。スペースがなくなり、スクロールが有効になるとすぐに、スペースは必要ありません。

QListView の使用:

私の項目は複雑すぎるため、QWidgets である必要があります。それらはフォーカスを持つことができず、選択できないため、アイテムベースのソリューションは「間違った方法」のようです. また、このソリューションは「重すぎる」ように聞こえます。

簡単な方法がないなんて信じられないので、まだ見ていないだけだと思います!

4

1 に答える 1

1

QListView大丈夫なはずです。あなたのアイテムは静的であり、それらとの相互作用はないと主張しています。フォーカスも選択もありません。QWidgetそのようなアイテムのaはやり過ぎのようです。固定サイズで、それ自体を描画できるものだけが必要です。それこそが、Qt のモデル ビュー システムのデリゲートの目的です。QAbstractItemDelegateアイテムに1 つ以上の を実装し、レンダリングするデータのモデルの実装を提供するだけです。はQAbstractItemViewすでにQAbstractScrollArea!

デリゲート内に HTML を描画したい場合、それは簡単です。繰り返しますが、QWidget は静的な表示にはやり過ぎです! これに QWidget を使用するのが「難しい」のには、非常に大きな理由があります。API が正しい解決策を示してくれます。モデルに各アイテムの html が含まれていると仮定すると、次のようにペイントできます。もちろん、sizeHint に夢中になることもできます。テキスト ドキュメントをキャッシュし、理想的にはモデルに格納する必要があります。

void MyDelegate::paint(QPainter* p, const QStyleOptionViewItem & opt, const QModelIndex & index) const
{
   QTextDocument doc;
   doc.setHtml(index.data().toString());
   doc.drawContents(p, QRect(QPoint(0,0), sizeHint(opt, index)));
}

QSize MyDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
{
   return QSize(100, 200);
}
于 2012-05-08T22:32:12.140 に答える