我希望QTableView的大小与它包含的表(并且已修复)相同,以便它没有滚动条
答案 0 :(得分:7)
您可以做的是根据他们拥有的数据计算您的tableview列宽度(或者您可以为每列调用resizeColumnToContents以将其大小调整为其内容)。然后将tableview宽度更改为等于或大于列的总宽度+垂直标题(如果显示)。您还需要跟踪模型更改并调整工作台视图宽度+如果显示水平标题,您可以跟踪列调整大小事件并再次调整它们。以下是一些示例代码:
初始化:
// add 3 columns to the tableview control
tableModel->insertColumn(0, QModelIndex());
tableModel->insertColumn(1, QModelIndex());
tableModel->insertColumn(2, QModelIndex());
...
// switch off horizonatal scrollbar; though this is not really needed here
ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// adjust size; see code below
adjustTableSize();
// connect to the horizontal header resize event (non needed if header is not shown)
connect(ui->tableView->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this,
SLOT(updateSectionWidth(int,int,int)));
// connect to the model's datachange event
connect(ui->tableView->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
this, SLOT(dataChanged(QModelIndex,QModelIndex)));
调整tableview大小:
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);
}
流程模型更改
void MainWindow::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
adjustTableSize();
}
处理水平标题调整大小
void MainWindow::updateSectionWidth(int logicalIndex, int, int newSize)
{
adjustTableSize();
}
希望这有帮助,尊重
答案 1 :(得分:0)
sum(item.sizeHint()+headeroffset+border)
对我来说效果不好,项目之间可能存在间距,即使网格已关闭。所以我这样做了调整:
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);
如果最后一列和最后一行可见,则应该有效。
答案 2 :(得分:0)
我试过serge_gubenko回答,但我没有为我工作(部分是因为我想要重新考虑高度和宽度)......所以我改变了它;要避免布局或父窗口小部件调整表格,您需要:
ui->tableView->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
然后:
ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QRect rect = ui->tableView->geometry();
int width = 2,length = 2;
for(int col = 0;col<proxySortModel->columnCount();++col){
if(!ui->tableView->isColumnHidden(col))
width += ui->tableView->columnWidth(col);
}
for(int row =0;row<proxySortModel->rowCount();++row)
length += ui->tableView->rowHeight(row);
rect.setWidth(width);
rect.setHeight(length);
ui->tableView->setGeometry(rect);
我希望这有助于某人。