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