10 Stimmen

Wie kann ich die Größe des QTableView ändern, sodass der Bereich nicht mehr gescrollt wird?

Ich möchte, dass die Größe des QTableView mit der Tabelle übereinstimmt, die sie enthält (und festgelegt ist), damit es keinen Bildlaufbalken hat

0 Stimmen

Ich bin überrascht, dass es keine integrierte Methode gibt, dies in einer Zeile zu tun. Immer noch nichts seit '09? Scheint etwas zu sein, das genauso wichtig sein sollte wie resizeColumnsToContents(), das bereits existiert.

9voto

serge_gubenko Punkte 19568

Was du tun könntest, ist die Breiten deiner TableView-Spalten entsprechend der Daten zu berechnen (oder du kannst einfach resizeColumnToContents für jede Spalte aufrufen, um sie an ihren Inhalt anzupassen). Ändere dann die TableView-Breite so, dass sie gleich oder größer als die Gesamtbreite der Spalten + vertikaler Header ist, falls angezeigt. Du müsstest auch Änderungen am Modell verfolgen und deine TableView-Breite anpassen + falls der horizontale Header angezeigt wird, kannst du Spalten-Resize-Events verfolgen und sie erneut anpassen. Unten ist ein Beispielcode dafür:

Initialisierung:

// Füge 3 Spalten zur TableView hinzu
tableModel->insertColumn(0, QModelIndex());
tableModel->insertColumn(1, QModelIndex());
tableModel->insertColumn(2, QModelIndex());
...
// Schalte die horizontale Scrollleiste aus; obwohl dies hier nicht wirklich nötig ist   
ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    
// Größe anpassen; siehe untenstehenden Code
adjustTableSize();
// Verbinde mit dem horizontalen Header-Resize-Event (nicht nötig, wenn der Header nicht angezeigt wird)
connect(ui->tableView->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this,
              SLOT(updateSectionWidth(int,int,int)));
// Verbinde mit dem Datenänderungs-Event des Modells
connect(ui->tableView->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
                this, SLOT(dataChanged(QModelIndex,QModelIndex)));

TableView-Größe anpassen:

void MainWindow::adjustTableSize()
{
    ui->tableView->resizeColumnToContents(0);
    ui->tableView->resizeColumnToContents(1);
    ui->tableView->resizeColumnToContents(2);

    QRect rect = ui->tableView->geometry();
    rect.setWidth(2 + ui->tableView->verticalHeader()->width() +
            ui->tableView->columnWidth(0) + ui->tableView->columnWidth(1) + ui->tableView->columnWidth(2));
    ui->tableView->setGeometry(rect);
}

Modelländerung verarbeiten:

void MainWindow::dataChanged(const QModelIndex &topLeft, const QModelIndex   &bottomRight)
{
    adjustTableSize();
}

Horizontales Header-Resize verarbeiten:

void MainWindow::updateSectionWidth(int logicalIndex, int, int newSize)
{
    adjustTableSize();
}

Ich hoffe das hilft, viele Grüße

0 Stimmen

Thx, aber ich war bereits in der Lage, es zu tun. Das einzige Problem hier ist, dass Sie die Randgröße berücksichtigen müssen. Außerdem stimmt etwas nicht mit den width() und height() Methoden des vertikalen Headers. Die width-Methode liefert einen Wert von 0 und die height-Methode hat mir etwas wie 259 gegeben, was viel zu groß war.

0 Stimmen

Entlang der gleichen Linie können Sie die Funktion QHeaderView::length() verwenden: viewRect.setWidth(customsItemsView->horizontalHeader()->leng‌​th());, die für mich zu funktionieren schien.

2voto

Kyef Punkte 49

Ich habe serge_gubenko Antwort ausprobiert, aber es hat für mich nicht funktioniert (teilweise, weil ich beide Höhe und Breite ändern wollte)... also habe ich es geändert; Um zu verhindern, dass die Tabelle von Layouts oder übergeordneten Widgets neu dimensioniert wird, benötigen Sie das:

ui->tableView->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);

Dann:

ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
ui->tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QRect rect = ui->tableView->geometry();
int width = 2,length = 2;
for(int col = 0;colcolumnCount();++col){
    if(!ui->tableView->isColumnHidden(col))
        width += ui->tableView->columnWidth(col);
}
for(int row =0;rowrowCount();++row)
    length += ui->tableView->rowHeight(row);
rect.setWidth(width);
rect.setHeight(length);
ui->tableView->setGeometry(rect);

Ich hoffe, dass dies jemandem hilft.

1voto

mugiseyebrows Punkte 3177

sum(item.sizeHint()+headeroffset+border) funktioniert für mich nicht gut, wahrscheinlich gibt es Abstand zwischen den Elementen, auch wenn das Raster ausgeschaltet ist. Daher habe ich die Anpassung folgendermaßen vorgenommen:

view->resizeRowsToContents();
view->resizeColumnsToContents();
QAbstractItemModel* model = view->model();
QHeaderView* horHeader = view->horizontalHeader();
QHeaderView* verHeader = view->verticalHeader();
int rows = model->rowCount();
int cols = model->columnCount();
int x = horHeader->sectionViewportPosition(cols-1) + horHeader->offset() 
        + horHeader->sectionSize(cols-1) + 1;
int y = verHeader->sectionViewportPosition(rows-1) + verHeader->offset() 
        + verHeader->sectionSize(rows-1) + 1;
QPoint p = view->viewport()->mapToParent(QPoint(x,y));
QRect g = view->geometry();
g.setSize(QSize(p.x(),p.y()));
view->setGeometry(g);

Sollte funktionieren, wenn die letzte Spalte und die letzte Zeile sichtbar sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X