Как указать высоту полосы прокрутки в QTreeView

Точно так же, как описанный заголовок, когда я перерисовываю полосу прокрутки в QTreeView, которая имеет заголовок (QHeaderView), но высота полосы прокрутки равна всей высоте QTreeView, и я хочу, чтобы высота полосы прокрутки равнялась высоте QTreeView минус высота заголовка. как на картинке ниже: просто так, исключить высоту заголовка

1 ответ

Решение

Решением вашей проблемы может быть установка положения вертикальной полосы прокрутки в constant_offset стоимость, полученная от QHeaderView (по оси Y).

Это может быть сделано путем подкласса QTreeView вот так:

class MyTreeView : public QTreeView
{
public:
    MyTreeView(QWidget* parent = nullptr): QTreeView(parent){}

    void updateVertScrollBar()
    {
        auto* ptr = verticalScrollBar();
        QRect rect = ptr->geometry();
        rect.setTop(header()->height());
        ptr->setGeometry(rect);
    }

    void resizeEvent(QResizeEvent* ev) override
    {
        QTreeView::resizeEvent(ev);
        updateVertScrollBar();
    }
};

В зависимости от sizePolicy updateVertScrollBar метод может быть вызван сразу после заполнения данных или, как представлено в примере реализации, обновление может происходить для каждого resizeEvent - который должен охватывать различные изменения размера, выполняемые для виджета.

РЕДАКТИРОВАТЬ

Кроме того, было бы сложно удалить пустое пространство, оставшееся от сокращенной полосы прокрутки. Сначала обозначим, что QTreeView построен из виджета видового экрана и полос прокрутки (среди прочих). Проблема, которую вы сейчас видите, связана с тем, что область просмотра плюс ширина вертикальной полосы прокрутки (если она видна) должны совпадать, и это вычисляется внутри.

Я заявил, что это сложно, так как при попытке изменить размер этих компонентов происходит множество вещей. Некоторые обновления называются на месте, некоторые - через цикл обработки событий. Вы можете проверить это, чтобы получить более подробную информацию о концепции. Подобный подход, вероятно, применяется к QTreeView,

По сути, вам нужно увеличить ширину области просмотра. Это должно быть, вероятно, сделано во время resizeEvent но вызов оттуда методов, таких как viewport()->setGeometry() может не закончиться хорошо - вы можете попасть в петлю. Вы можете попробовать blockSignals но я не уверен, что это поможет. В общем, если вы хотите возиться с внутренними данными данного Qt виджет, вы должны пройти его реализацию хотя бы вкратце.

Другие вопросы по тегам