Проблемы с горизонтальной полосой прокрутки QTreeView - PullRequest
7 голосов
/ 08 июля 2011

У меня проблема с горизонтальной полосой прокрутки 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());
}

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

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

Спасибо.

Ответы [ 5 ]

11 голосов
/ 11 июля 2011

Эта запись часто задаваемых вопросов может помочь.

В двух словах:

  • Установите горизонтальный заголовок, чтобы изменить размер содержимого столбца (это относится дажеесли заголовок скрыт) * ​​1008 *
  • Отключите свойство 'stretchLastHeaderSection', чтобы предотвратить автоматическое изменение размера горизонтального заголовка на ширину области просмотра (которая, как представляется, переопределяет вышеуказанную настройку для изменения размера столбца)
3 голосов
/ 06 сентября 2015

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

  • Отключить горизонтальный заголовок headerStretchLastSection. и
  • ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
2 голосов
/ 09 октября 2014

Для меня сработало:

  • Установите для свойства horizontalScrollBarPolicy значение ScrollBarAsNeeded.
  • Установите для свойства headerMinimumSectionSize горизонтального заголовка то же значение, что и для свойстваЗначение 'geometry Width'.
  • Установите для свойства headerDefaultSectionSize горизонтального заголовка значение, в два раза превышающее значение headerMinimumSectionSize.
  • Отключите свойство headerStretchLastSection горизонтального заголовка (как описано в другом месте).

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

0 голосов
/ 07 сентября 2017

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

0 голосов
/ 12 января 2016

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

Думаю, это кому-нибудь может пригодиться.

...