2012-01-24 4 views
5

Я ученик программист, и я использую Qt для создания интерфейса GUI для работы. У меня есть QTreeWidget, который имеет в общей сложности 8 столбцов. Входные данные, которые необходимо вводить в каждый из этих столбцов, довольно малы. В этом отношении я пытался найти способ изменить размер всех столбцов на минимальное требуемое пространство. как действие, которое выполняется, когда вы нажимаете на разделители. Я просмотрел несколько веб-сайтов и документацию Qt и не нашел решения. Посмотрев документацию, кажется, что есть несколько способов сделать это, но я не могу заставить ее работать. Я начинаю думать, что мне нужно что-то включить/отключить. Это как если бы изменения, которые я вписываю в мою функцию сборки (эта функция очищает таблицу; считывает данные из моего вектора, отображает определенные данные в таблице, а затем допускает изменение размеров заголовков/столбцов до достаточно большого размера для соответствия содержимое столбца) даже не применяются. Я попытался следующие без изменений:Как изменить размер столбцов в QTreeWidget до минимального требуемого пространства

 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; 
     } 

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

+0

Я думаю, что мой цикл является проблемой здесь; в частности, я думаю, что .size может быть ответственным за эту проблему. –

ответ

14

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

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

+0

Это действительно странно, но когда я создал отдельный цикл в моей функции сборки для моих размеров столбцов, он работал нормально ... очень странно. СПАСИБО ЗА ВАШУ ПОМОЩЬ! Ваш пример очень помог мне, и я уверен, что это поможет другим! –

+1

К сожалению, этот метод меняет размер в соответствии с содержимым заголовка для меня. Данные отображаются в слове. –

2

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

Решение:

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