C++ 如何将 QTreeWidget 中的列调整为所需的最小空间
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8995829/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to resize columns in QTreeWidget to the minimum space required
提问by Wylie Coyote SG.
I am a student programmer and I am using Qt to build a GUI interface for work. I have a QTreeWidget
that has a total of 8 Columns. The input that needs to be entered into each one of these columns is fairly small. In that regard, I was trying to find a way to re-size all of the columns to the least amount of space required. much like the action that is performed when you click on the dividers. I have looked over several websites and the Qt documentation and haven't found a solution. After looking over the documentation it seems that there are a bunch of ways to do this but I cant get one to work. I am beginning to think that I need to enable/disable something somewhere. It's as if the changes I write in to my build function (This function clears the table; Reads data from my vector, displays certain data in the table, and then is suppose to re-size the headers/columns to just enough size to fit the contents of the column) are not even applied. I have tried the following with no changes:
我是一名学生程序员,我正在使用 Qt 构建一个用于工作的 GUI 界面。我有一个QTreeWidget
总共有 8 列。需要输入到这些列中的每一列的输入都相当小。在这方面,我试图找到一种方法将所有列的大小重新调整为所需的最少空间。很像单击分隔线时执行的操作。我查看了几个网站和 Qt 文档,但没有找到解决方案。查看文档后,似乎有很多方法可以做到这一点,但我无法让一个工作。我开始认为我需要在某处启用/禁用某些东西。就好像我写入构建函数的更改一样(此函数清除表;从向量中读取数据,在表中显示某些数据,然后假设将标题/列的大小重新调整为刚好适合列内容的大小)甚至没有应用。我已经尝试了以下没有改变:
ui->treeWidgetInjections->setColumnWidth(i, minimumWidth());
ui->treeWidgetInjections->resizeColumnToContents(i);
ui->treeWidgetInjections->header()->ResizeToContents;
ui->treeWidgetInjections->header()->resizeSection(i, minimumWidth());
All of these are in the end of of my build Function (unrelated info removed):
所有这些都在我的构建功能的末尾(删除了无关信息):
ui->treeWidgetInjections->clear();
for (int i=0; i < qTreeInjectionData.size(); i++)
{
//fill Qtree with items;
//fill QTree items with data;
//re size function here;
}
Please only leave productive feedback as I am only interested in learning and overcoming this challenge. Thanks in advance!
请只留下富有成效的反馈,因为我只对学习和克服这一挑战感兴趣。提前致谢!
回答by Pietro Lorefice
This minimal example works for me:
这个最小的例子对我有用:
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);
}
All you need to do is call the resizeColumnToContents()
method once for every column after you populate the view. Let me know if the problem persists.
您需要做的就是resizeColumnToContents()
在填充视图后为每一列调用一次该方法。如果问题仍然存在,请告诉我。
回答by Torkil Kollsker
The problem for me was that StretchLastSection
was set to true and if this value is set to true, this property will override the resize mode set on the last section in the header.
我的问题是它StretchLastSection
被设置为 true,如果这个值被设置为 true,这个属性将覆盖标题中最后一部分设置的调整大小模式。
Solution:
解决方案:
_treeWidget = new UIWidgetSceneTree();
_treeWidget->header()->setStretchLastSection(false);
_treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);