通过模型设置QTableView中列的初始宽度

6
我是一名有用的助手,可以翻译文本。
我的 QTableView 基于 QAbstractTableModel。在 QAbstractTableModel 中重新实现了 headerData() 方法,根据模型设置列名和宽度。但是...
switch( role )
{
    ...
    case Qt::SizeHintRole       : return QSize( 500, 0 );
    ...
}

没有效果。表格中的所有列都具有相同的width()。我应该怎么做才能正确设置初始列宽。

P.S.: 在这个问题中,建议使用代理来解决相同的问题,但我认为应该使用headerData()。


尝试双击标题中的节处理程序(节之间的空格)。在这种情况下,它应该调整大小为大小提示宽度。 - Ezee
@vahancho - 我也是这样 - kaa
@Ezee - 是的,就像你说的那样它是有效的。但是初始状态怎么办?也许需要对视图进行一些操作,以应用来自SizeHintRole的宽度? - kaa
1
我认为这是水平大小提示的唯一用法。但是您可以从QTableView继承并在setModel中应用模型的大小。 - Ezee
@Ezee,你可以将你的评论发布为答案,它们解释了如何使用headerData()函数以及如何在QTableView中设置列的初始大小; - kaa
显示剩余2条评论
4个回答

9

QAbstractItemModel 假定可以在 headerData 方法中使用 Qt::SizeHintRole 来返回标头部分的预期大小。然而,这些信息的使用取决于特定视图实现的情况。

QHeaderView 使用 Qt::SizeHintRole 来计算其建议宽度(如果是水平方向)或高度(如果是垂直方向)。

QTableView 订阅了 QHeaderViewsectionHandleDoubleClicked 信号,并根据单元格内容大小和标头部分的宽度调整相应的列宽度。如果处理了 Qt::SizeHintRole 角色,则标头部分的宽度为由 headerData 返回的宽度;否则,它将基于标头部分文本(内容)进行计算。

如果要根据 Qt::SizeHintRole 初始化列宽度,您需要:

  • QTableView 继承您的类
  • 重新实现方法 setModel,并使用基于 Qt::SizeHintRole 的初始列宽度来设置每列的宽度,使用方法 QTableView::setColumnWidth

6

在填充模型后,您可以为各列设置单独的策略。这对我非常有帮助,因为我的表格有4个列,其中我希望前两个填充视图,而最后两个则适应内容,这些内容相当窄,同时仍然完全填满视图。

this->ui->tableView->setModel(model);

ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
ui->tableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents);

enter image description here


3

您有一个视图问题,并且正在查找程序的模型部分。

QTableView类具有简单的方法:

void QTableView::setColumnWidth(int column, int width)

并且。
void QTableView::setRowHeight(int row, int height)

使用headerData()是更加灵活的解决方案,因为我不会将列宽绑定到某个列索引上。模型告诉视图应该为特定列显示哪些数据以及该列的宽度是多少。此外,headerData()对于标题行的高度可以正常工作,但是无法控制行宽度。也许我应该调整QTableView或QHeaderView的某些属性,以正确地应用sizeHint? - kaa

1

为横向和/或纵向标题添加一行或两行:

Qt 4:


```html // 需要翻译的代码 ```
tableView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);

Qt 5:

tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

没有 QHeaderView::setResizeMode 这个函数? - Mohammad Kanan
如果在当前库代码中找不到任何示例(很可能是由其他人而非M.Kanan提交的),那么就没有理由进行投入。我已更新答案以适用于Qt 4和5。 - oklas

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