Как изменить размер столбцов в QTreeWidget до минимально необходимого пространства - PullRequest
7 голосов
/ 25 января 2012

Я студент-программист и использую 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;
        }

Пожалуйста, оставляйте только продуктивные отзывы, так как меня интересует только изучение и преодоление этой проблемы. Заранее спасибо!

Ответы [ 2 ]

18 голосов
/ 25 января 2012

Этот минимальный пример работает для меня:

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() один раз для каждого столбца после заполнения представления.Дайте мне знать, если проблема не исчезнет.

8 голосов
/ 31 мая 2016

Проблема для меня заключалась в том, что для StretchLastSection было установлено значение true, а если для этого значения установлено значение true, это свойство будет переопределять режим изменения размера, установленный в последнем разделе заголовка.

Решение:

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