如何将QTreeWidget中的列调整为所需的最小空间

14

我是一名学生程序员,正在使用Qt构建工作中的GUI界面。我有一个包含8个列的QTreeWidget。需要输入到每个列中的内容都相当小。因此,我试图找到一种方法来将所有列调整为所需空间最少的大小。就像点击分隔符时执行的操作一样。我查看了几个网站和Qt文档,但没有找到解决方案。在查阅文档后,似乎有很多方法可以做到这一点,但我无法让其中任何一种方法起作用。我开始认为我需要在某个地方启用/禁用某些东西。好像我在构建函数中编写的更改(该函数清除表格;从向量中读取数据,在表格中显示某些数据,然后应该将标题/列调整为刚好足够适合列内容的大小)甚至没有被应用。我已经尝试过以下操作,但没有变化:

        ui->treeWidgetInjections->setColumnWidth(i, minimumWidth());
        ui->treeWidgetInjections->resizeColumnToContents(i);
        ui->treeWidgetInjections->header()->ResizeToContents;
        ui->treeWidgetInjections->header()->resizeSection(i, minimumWidth());

这些都在我的构建函数的末尾(已删除不相关信息):

ui->treeWidgetInjections->clear();
    for (int i=0; i < qTreeInjectionData.size(); i++)
        {
            //fill Qtree with items;
            //fill QTree items with data;
            //re size function here;
        }

请给予有建设性的反馈,因为我只对学习和克服这个挑战感兴趣。提前致谢!


我认为我的for循环有问题;特别是我认为.size可能是导致这个问题的原因。 - Wylie Coyote SG.
我想让qtreewidget的第一列小于20像素,但它从未小于某些宽度,如80像素或90像素。我该怎么做? - Denis Turgenev
2个回答

29

这个简单的示例对我有效:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QVBoxLayout *layout = new QVBoxLayout(centralWidget());
    QTreeWidget *tree = new QTreeWidget(this);
    layout->addWidget(tree);

    tree->setColumnCount(3);

    QStringList first, second, third;
    first  << "xxxxxxxxx"      << "xxxxxxxxxxxxx"     << "xxxxxxxx";
    second << "xxxxx"          << "xxxxxxxxxxxxxxxxx" << "xxxxx";
    third  << "xxxxxxxxxxxxxx" << "xxxxxxxxxx"        << "xxxxxxxx";

    tree->insertTopLevelItem(0, new QTreeWidgetItem(first));
    tree->insertTopLevelItem(0, new QTreeWidgetItem(second));
    tree->insertTopLevelItem(0, new QTreeWidgetItem(third));

    for(int i = 0; i < 3; i++)
        tree->resizeColumnToContents(i);
}

在你填充视图后,只需针对每一列调用resizeColumnToContents()方法即可。如果问题仍然存在,请告诉我。


非常奇怪,但是当我在构建函数中为我的列重新调整大小创建了一个单独的for循环时,它就正常工作了...非常奇怪。感谢您的帮助!您的示例对我有很大帮助,我相信这也会帮助其他人! - Wylie Coyote SG.
6
很遗憾,这种方法只能根据标题的内容来调整大小。数据显示为自动换行。 - Hareen Laks
请确保使用resizeColumnToContents而不是resizeColumn[S]ToContents - azzamsa
@HareenLaks 我也一样,这里的答案都没有帮到我。你找到方法了吗? - László Papp

19

对我来说问题在于StretchLastSection被设置为true,如果将此值设置为true,则该属性将覆盖标头中最后一个部分设置的调整大小模式。

解决方法:

_treeWidget = new UIWidgetSceneTree();
_treeWidget->header()->setStretchLastSection(false);
_treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);

我更喜欢这种调整大小的方式,而不是逐个定义列数。 - azzamsa
2
UIWidgetSceneTree是什么?它是您自定义的QTreeView子类吗?这使得这个答案有点令人困惑。 - Arthur Tacca
我不知道为什么,在我的QTreeView上,view->resizeColumnToContents(0);没有起作用,而view->header()->setSectionResizeMode(QHeaderView::ResizeToContents);则有用。但是这种解决方案的问题在于用户无法再调整表头大小,我觉得这非常限制。 - László Papp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接