QTreeView с фиксированной шириной столбца

Сегодня я пытаюсь настроить QTreeView чтобы соответствовать моим требованиям. На мой взгляд в основном три колонки. Второй и третий столбцы должны иметь ширину ровно 50 пикселей независимо от размера виджета. Первый столбец должен занимать оставшееся пространство.

Если я увеличу свой виджет, первый столбец должен автоматически занять свободное место, тогда как второй и третий столбцы должны сохранить заданную ширину 50 пикселей.

Это то, что я пробовал до сих пор:

main.cpp

#include <QApplication>
#include <QTreeView>
#include <QDebug>
#include <QStandardItemModel>
#include <QHeaderView>
#include "ColumnDelegate.h"
int main(int argc, char** args) {
QApplication app(argc, args);
auto widget = new QTreeView;
auto model = new QStandardItemModel;
model->insertRow(0, { new QStandardItem{ "Variable width" }, new QStandardItem{ "Fixed width 1" }, new QStandardItem{ "Fixed width 2" } });
model->insertRow(0, { new QStandardItem{ "Variable width" }, new QStandardItem{ "Fixed width 1" }, new QStandardItem{ "Fixed width 2" } });
widget->setModel(model);
widget->setItemDelegateForColumn(1, new ColumnDelegate);
widget->setItemDelegateForColumn(2, new ColumnDelegate);
auto header=widget->header();

header->setSectionResizeMode(QHeaderView::Fixed);
header->resizeSection(1, 50);
header->resizeSection(2, 50);
widget->show();
app.exec();
}

ColumnDelegate.h

#pragma once

#include <QStyledItemDelegate>

class ColumnDelegate : public QStyledItemDelegate {
Q_OBJECT
public:
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
QSize ret= QStyledItemDelegate::sizeHint(option, index);
ret.setWidth(50);
return ret;
}
};

Но после казни я получил:

Третий столбец занимает много места

Третий столбец занимает еще больше места, но первый столбец должен занимать больше места

Кто-нибудь знает, как реализовать мое желаемое поведение с наименьшим количеством работы?

1

Решение

Проблема в том, что режим изменения размера применяется ко всем разделам равномерно. Вы можете использовать перегрузку QHeaderView::setSectionResizeMode это позволяет настройку каждого раздела для точной настройки. В вашем случае, используя комбинацию режимы изменения размера: QHeaderView::Stretch для расширения столбцов и QHeaderView::Fixed для тех, кто с фиксированной шириной.

Кроме того, вы должны отключить параметр, который автоматически растягивает последний раздел. использование QHeaderView::setStretchLastSection.

Пример:

header->setSectionResizeMode(0, QHeaderView::Stretch);
header->setSectionResizeMode(1, QHeaderView::Fixed);
header->setSectionResizeMode(2, QHeaderView::Fixed);
header->setStretchLastSection(false);

Наконец, QItemDelegate::sizeHint не влияет на разделы, отмеченные QHeaderView::Fixed режим изменения размера. Просто позвони resizeSection с желаемой шириной и забудьте о делегате элемента (если вам не нужно что-либо еще).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]