【问题标题】:How to resize columns in QTreeWidget to the minimum space required如何将 QTreeWidget 中的列大小调整为所需的最小空间
【发布时间】:2012-01-24 23:28:13
【问题描述】:

我是一名学生程序员,我正在使用 Qt 构建一个用于工作的 GUI 界面。我有一个QTreeWidget,共有 8 列。需要输入到这些列中的每一列的输入相当小。在这方面,我试图找到一种方法将所有列的大小重新调整为所需的最少空间。很像单击分隔线时执行的操作。我查看了几个网站和 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 可能是造成这个问题的原因。
  • 我想让 qtreewidget 的第一列小于 20px,但它永远不会小于像 80px 或 90px 这样的宽度。我该怎么做?

标签: c++ qt header qtreewidget


【解决方案1】:

这个最小的例子对我有用:

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 循环时,它工作得很好……很奇怪。感谢您的帮助!您的示例对我有很大帮助,我相信这会对其他人有所帮助!
  • 不幸的是,这种方法只根据我的标题内容调整大小。数据显示为自动换行。
  • 确保它是resizeColumnToContents 而不是resizeColumn[S]ToContents
【解决方案2】:

我的问题是 StretchLastSection 设置为 true,如果此值设置为 true,则此属性将覆盖在标题的最后一部分设置的调整大小模式。

解决方案:

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

【讨论】:

  • 我更喜欢这种方式来调整大小,而不是一一定义列号。
  • 什么是UIWidgetSceneTree?它是您的QTreeView 的自定义子类吗?这让这个答案有点混乱。
猜你喜欢
  • 1970-01-01
  • 2014-11-08
  • 2021-07-04
  • 2016-02-10
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
相关资源
最近更新 更多