Сегодня я пытаюсь настроить 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;
}
};
Но после казни я получил:
Кто-нибудь знает, как реализовать мое желаемое поведение с наименьшим количеством работы?
Проблема в том, что режим изменения размера применяется ко всем разделам равномерно. Вы можете использовать перегрузку 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
с желаемой шириной и забудьте о делегате элемента (если вам не нужно что-либо еще).
Других решений пока нет …