2012-01-24 6 views
5

Sono un programmatore studente e sto usando Qt per creare un'interfaccia GUI per il lavoro. Ho un QTreeWidget che ha un totale di 8 colonne. L'input che deve essere inserito in ognuna di queste colonne è abbastanza piccolo. A tale proposito, stavo cercando di trovare un modo per ridimensionare tutte le colonne con il minor spazio richiesto. molto simile all'azione che viene eseguita quando si fa clic sui divisori. Ho esaminato diversi siti Web e la documentazione Qt e non ho trovato una soluzione. Dopo aver esaminato la documentazione, sembra che ci siano molti modi per farlo, ma non riesco a far funzionare nessuno. Sto iniziando a pensare che ho bisogno di abilitare/disabilitare qualcosa da qualche parte. È come se le modifiche che scrivo alla mia funzione di compilazione (Questa funzione cancella la tabella; Legge i dati dal mio vettore, visualizza determinati dati nella tabella, e quindi suppone ridimensionare le intestazioni/colonne con una dimensione sufficiente per adattarsi il contenuto della colonna) non vengono nemmeno applicati. Ho provato quanto segue senza modifiche:Come ridimensionare le colonne in QTreeWidget allo spazio minimo richiesto

 ui->treeWidgetInjections->setColumnWidth(i, minimumWidth()); 
     ui->treeWidgetInjections->resizeColumnToContents(i); 
     ui->treeWidgetInjections->header()->ResizeToContents; 
     ui->treeWidgetInjections->header()->resizeSection(i, minimumWidth()); 

Tutte queste sono alla fine della mia funzione build (informazioni non correlato rimosso):

ui->treeWidgetInjections->clear(); 
    for (int i=0; i < qTreeInjectionData.size(); i++) 
     { 
      //fill Qtree with items; 
      //fill QTree items with data; 
      //re size function here; 
     } 

Si prega di lasciare solo un feedback produttivo come io sono solo interessato all'apprendimento e al superamento di questa sfida. Grazie in anticipo!

+0

penso che il mio ciclo for è il problema qui; in particolare penso che .size potrebbe essere stato responsabile di questo problema. –

risposta

14

Questo esempio minimo funziona per 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); 
} 

Tutto quello che dovete fare è chiamare il metodo resizeColumnToContents() una volta per ogni colonna dopo si popolano il panorama. Fammi sapere se il problema persiste.

+0

È davvero strano ma quando ho creato un ciclo separato per la mia funzione di build per le mie ridimensionamenti di colonne, ha funzionato bene ... molto strano. GRAZIE PER L'AIUTO! Il tuo esempio mi ha aiutato molto e sono sicuro che questo aiuterà gli altri! –

+1

Sfortunatamente, questo metodo si ridimensiona solo in base ai contenuti dell'intestazione per me. Dati visualizzati a capo di parole. –

2

Il problema per me era che StretchLastSection era impostato su true e se questo valore è impostato su true, questa proprietà sostituirà la modalità di ridimensionamento impostata nell'ultima sezione nell'intestazione.

Soluzione:

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