繁体   English   中英

QTreeView具有固定的列宽

[英]QTreeView with fixed column widths

今天,我正在尝试配置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 resize模式的节没有任何影响。 只需使用所需的宽度调用resizeSection ,而无需考虑项目委托(除非您需要其他任何东西)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM