8

QTreeView の水平スクロールバーに問題があり、表示されません。水平スクロールバー ポリシーを ScrollBarAsNeeded に設定しましたが、必要に応じて表示されません。展開された信号と折りたたまれた信号をスロットに接続しようとしました:

connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(update_scroll_area(QModelIndex)));
connect(this, SIGNAL(collapsed(QModelIndex)), this, SLOT(update_scroll_area(QModelIndex)));

スロットは 1 行のコードで構成されます。

update_scroll_area(const QModelIndex& i)
{
    resizeColumnToContents(i.column());
}

これにより、スクロールバーが機能しますが、ツリービューアイテムを展開/折りたたむ場合のみです。

アプリケーションの開始から終了まで、「毎回」水平スクロールバーを機能させる必要があります。どのように組織化できますか?

ありがとうございました。

4

5 に答える 5

13

このFAQエントリが役立つ場合があります。

一言で言えば:

  • 列の内容に合わせてサイズを変更する水平ヘッダーを設定します(これは、ヘッダーが非表示の場合でも適用されます)
  • 'stretchLastHeaderSection'プロパティを無効にして、水平ヘッダーがビューポートの幅に自動的にサイズ変更されないようにします(これは、列のサイズにサイズ変更するために上記の設定をオーバーライドするように見えます)
于 2011-07-11T10:42:38.753 に答える
6

QT5 を使用している場合は、treewidget を「水平」自動スクロールにするためにこれを試してください。

  • 水平ヘッダーの を無効にしheaderStretchLastSectionます。と
  • ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
于 2015-09-06T03:02:02.387 に答える
2

私にとってうまくいったのは:

  • horizontalScrollBarPolicyプロパティを に設定しますScrollBarAsNeeded
  • 水平ヘッダーのheaderMinimumSectionSizeプロパティを「ジオメトリの幅」の値と同じ値に設定します。
  • 水平ヘッダーのheaderDefaultSectionSizeプロパティを約 2 倍のheaderMinimumSectionSize値に設定します。
  • 水平ヘッダーのheaderStretchLastSectionプロパティを無効にします (他の場所で説明されているように)。

変更中のフォームで Qt Designer を使用してこれを行いました。

于 2014-10-08T23:05:48.520 に答える
2

QTreeWidget私の見解では、水平スクロールバーを表示するのではなく、接尾辞の楕円 (つまり、"...") を使用してツリー項目を切り詰めるデフォルトの動作は、非常識で役に立たず、誰も望んでいないものです。しかし、それは私たちが得たものです。

次の PySide2 固有のQTreeWidgetサブクラスは、現在のツリーの列数に合わせてスケーリングする列対応の方法で、この欠点にインテリジェントに対処します。

from PySide2.QtWidgets import QHeaderView, QTreeWidget

class QScrollableTreeWidget(QTreeWidget):
    '''
    :mod:`QTreeWidget`-based widget marginally improving upon the stock
    :mod:`QTreeWidget` functionality.

    This application-specific widget augments the stock :class:`QTreeWidget`
    with additional support for horizontal scrollbars, automatically displaying
    horizontal scrollbars for all columns whose content exceeds that column's
    width. For unknown reasons, the stock :class:`QTreeWidget` intentionally
    omits this functionality.
    '''

    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)

        # Header view for this tree.
        header_view = self.header()

        # To display a horizontal scrollbar instead of an ellipse when resizing
        # a column smaller than its content, resize that column's section to its
        # optimal size. For further details, see the following FAQ entry:
        #     https://wiki.qt.io/Technical_FAQ#How_can_I_ensure_that_a_horizontal_scrollbar_and_not_an_ellipse_shows_up_when_resizing_a_column_smaller_than_its_content_in_a_QTreeView_.3F
        header_view.setSectionResizeMode(QHeaderView.ResizeToContents)

        # By default, all trees contain only one column. Under the safe
        # assumption this tree will continue to contain only one column, prevent
        # this column's content from automatically resizing to the width of the
        # viewport rather than this column's section (as requested by the prior
        # call). This unfortunate default overrides that request.
        header_view.setStretchLastSection(False)

    def setColumnCount(self, column_count: int) -> None:
        super().setColumnCount(column_count)

        # If this tree now contains more than one column, permit the last such
        # column's content to automatically resize to the width of the viewport.
        if column_count != 1:
            self.header().setStretchLastSection(True)

理論的には、この実装は PyQt5 と C++ の両方に簡単に書き換えられるはずです。Qt は露骨に非インテリジェントなデフォルトよりも優れているからです。

于 2017-09-07T08:57:56.480 に答える
0

水平スクロール バーがカスタム treeView クラスに表示されない別のケースを見つけました。それは、「setHeaderHidden()」を true に設定し、resizeEvent() をオーバーライドしない場合です。これはまさに私に起こったことであり、スロット resizeColumnToContents(0) を呼び出して resizeEvent() をオーバーライドしました。これは、水平スクロール バーを機能させるためにカスタム ツリー ビュー クラスに 1 つの列しかないためです。

これは誰かに役立つかもしれないと思った。

于 2016-01-11T21:39:31.927 に答える