如何使QTableView填满100%的宽度?

41

这是我的软件截图:

正如您所见,第一个 QTableView 的表头没有占满 100% 的宽度。实际上,在字段 size 右侧有一小段垂直的白色空间。

我应该如何使表头占据 QTableView 宽度的 100%?


1
可能是重复的问题:QStandardItemModel inside Qtableview - liuyi.luo
4个回答

54
如果您正在使用Qt 5,则QHeaderView :: setResizeMode()不再可用。相反,您可以使用{{link1:QHeaderView :: setSectionResizeMode()}}:
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

或者对每一列都进行调用:

for (int c = 0; c < ui->tableView->horizontalHeader()->count(); ++c)
{
    ui->tableView->horizontalHeader()->setSectionResizeMode(
        c, QHeaderView::Stretch);
}

1
同样的问题,仍然不能正常工作。最后一段被拉伸了,但第一段没有。 - user2429940
3
Qt 5.1 版本对我有用。在使用这段代码设置列宽调整模式之前,你是否已将模型设置到了表格视图中?如果没有,你还没有任何列,此代码不会起作用。 - user362638
11
不要为每一列都调用QHeaderView::setSectionResizeMode()。为了自动将传递的伸展应用于所有列,只需调用该方法一次而不是迭代地传递显式列索引:例如,ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);。因此上面的for循环可以简化为一个简单的一行代码。请参见这个相关答案 - Cecil Curry
使用setSectionResizeMode()Stretch后,您不能调整宽度,对吗? - Jason

26

使用 view->horizontalHeader()->setStretchLastSection(true) 来使最后一列扩展到剩余空间。

此外,使用 view->horizontalHeader()->setResizeMode(QHeaderView::Stretch) 来使所有列的宽度相同。


3
如果您正在使用QtCreator/Designer,您可以在属性部分找到这个。 - Son-Huy Pham
第一个命令有效,但第二个不行。这意味着现在最后一列被拉伸了,但是两列的大小不同。 - user2429940

14

只使用以下内容即可正常工作:

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

我正在使用Qt 5.2!


0

我在表格的所有单元格之间分配列宽度时遇到了困难。 在我的情况下,在模型的headerData函数中,我执行了以下操作(需要在某个地方调用resizeColumnsToContents()):

QVariant headerData(int section, Qt::Orientation orientation, int role) const override {
  if (orientation == Qt::Vertical) {
    return QVariant();
  }
  if (role == Qt::SizeHintRole) {
    auto* p = qobject_cast<QTableView*>(QObject::parent());
    if (p == nullptr) return QVariant();
    // Parent total width.
    const int w = p->viewport()->size().width() -
        p->verticalScrollBar()->sizeHint().width();
    QSize qs;
    // Default height.
    qs.setHeight(p->verticalHeader()->defaultSectionSize());
    // Width per column.
    switch (section) {
      case 0:
        qs.setWidth(w * 0.45);
        return QVariant(qs);
      case 1:
        qs.setWidth(w * 0.45);
        return QVariant(qs);
      // ... others
      default: ;
    }
    return QVariant();
  }
  if (role == Qt::DisplayRole) {
    // header titles.
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接