具有固定列宽的 QTreeView
QTreeView with fixed column widths
今天我正在尝试配置 QTreeView
以满足我的要求。我的观点基本上分为三列。第二列和第三列应该正好是 50 像素宽,无论小部件的大小是多少。第一列应该占据剩余的 space.
如果我放大我的小部件,第一列应该自动占据需要的空间 space,而第二列和第三列应该保持其给定的 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
that allows per-section settings to fine-grain tuning. In your case, using a combination of resize modes 的重载: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
并忘记项目委托(除非您需要其他任何东西)。
今天我正在尝试配置 QTreeView
以满足我的要求。我的观点基本上分为三列。第二列和第三列应该正好是 50 像素宽,无论小部件的大小是多少。第一列应该占据剩余的 space.
如果我放大我的小部件,第一列应该自动占据需要的空间 space,而第二列和第三列应该保持其给定的 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
that allows per-section settings to fine-grain tuning. In your case, using a combination of resize modes 的重载: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
并忘记项目委托(除非您需要其他任何东西)。