Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to resize columns in QTreeWidget to the minimum space required

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:

        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!

like image 406
Wylie Coyote SG. Avatar asked Jan 24 '12 23:01

Wylie Coyote SG.


2 Answers

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.

like image 156
Pietro Lorefice Avatar answered Oct 04 '22 02:10

Pietro Lorefice


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.

Solution:

_treeWidget = new UIWidgetSceneTree();
_treeWidget->header()->setStretchLastSection(false);
_treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
like image 38
Torkil Kollsker Avatar answered Oct 04 '22 02:10

Torkil Kollsker