Проблемы с горизонтальной полосой прокрутки QTreeView

У меня проблема с горизонтальной полосой прокрутки QTreeView, она не отображается. Я установил для политики горизонтальной полосы прокрутки значение ScrollBarAsNeeded, но при необходимости она не отображается. Попробовали подключить развернутые и свернутые сигналы к слоту:

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

Слот состоит из одной строки кода:

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

Это заставляет полосу прокрутки работать, но только когда я разворачиваю / сворачиваю элементы представления в виде дерева.

Мне нужно, чтобы горизонтальная полоса прокрутки работала «каждый раз», от запуска приложения до его завершения. Как это можно организовать?

Спасибо.


person Dehumanizer    schedule 08.07.2011    source источник


Ответы (5)



если вы используете QT5, попробуйте сделать это, чтобы сделать виджет "горизонтальным" автопрокруткой:

  • Отключить горизонтальный заголовок headerStretchLastSection. и
  • ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
person take-it    schedule 06.09.2015

Что сработало для меня, так это:

  • Установите для свойства horizontalScrollBarPolicy значение ScrollBarAsNeeded.
  • Установите для свойства headerMinimumSectionSize горизонтального заголовка то же значение, что и для параметра «Ширина геометрии».
  • Установите для свойства headerDefaultSectionSize горизонтального заголовка значение примерно вдвое больше значения headerMinimumSectionSize.
  • Отключите свойство headerStretchLastSection горизонтального заголовка (как описано в другом месте).

Я сделал это с помощью Qt Designer в форме, которую изменял.

person pdxesto    schedule 08.10.2014

На мой взгляд, стандартное 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 заслуживает большего, чем явно неразумные настройки по умолчанию.

person Cecil Curry    schedule 07.09.2017

Я только что обнаружил еще один случай, когда горизонтальная полоса прокрутки не отображается в пользовательском классе treeView. Это когда вы устанавливаете для setHeaderHidden () значение true и не переопределяете resizeEvent (). Это именно то, что случилось со мной, и я переопределил resizeEvent (), вызвав слот resizeColumnToContents (0), поскольку у меня есть только один столбец в моем пользовательском классе представления дерева, чтобы горизонтальная полоса прокрутки работала.

Думал, что это может быть кому-то полезно.

person qtProgrammer    schedule 11.01.2016