【问题标题】:Initial width of column in QTableView via model通过模型在 QTableView 中列的初始宽度
【发布时间】:2014-09-24 07:44:45
【问题描述】:

我有基于 QAbstractTableModel 的 QTableView。 在 QAbstractTableModel 中重新实现了方法 headerData() 以根据模型设置列名和宽度。但是

switch( role )
{
    ...
    case Qt::SizeHintRole       : return QSize( 500, 0 );
    ...
}

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

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

【问题讨论】:

  • 我只能更改标题高度。
  • 尝试双击标题中的部分处理程序(部分之间的空间)。在这种情况下,它看起来应该调整为尺寸提示宽度
  • @vahancho - 我也一样
  • @Ezee - 是的,它就像你说的那样工作。但是初始状态呢?可能需要对视图做一些事情,从 SizeHintRole 应用宽度?
  • 我认为这是水平尺寸提示的唯一用法。但是您可以从QTableView 继承并应用setModel 中模型的大小。

标签: qt


【解决方案1】:

QAbstractItemModel 假定 Qt::SizeHintRole 可以在 headerData 方法中使用以返回标题部分的假定大小。但是,此信息的使用取决于某些视图实现。

QHeaderView 使用Qt::SizeHintRole 来计算它的推荐宽度(如果它是水平的)和高度(如果它是垂直的)。

QTableView 订阅 QHeaderView 的信号 sectionHandleDoubleClicked 并根据单元格内容大小和标题部分的宽度调整适当列的大小。标题部分的宽度是headerDataQt::SizeHintRole返回的宽度,如果这个角色被处理,否则它根据标题部分文本(内容)计算。

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

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

【讨论】:

    【解决方案2】:

    填充模型后,您可以在列上设置单独的策略。这对我有帮助,我的表格有 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);
    

    【讨论】:

      【解决方案3】:

      你有一个视图问题,你正在寻找程序的模型部分。

      QTableView 类有简单的方法:

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

      void QTableView::setRowHeight(int row, int height)
      

      【讨论】:

      • 使用 hedaerData() 是更灵活的解决方案,因为我没有将列宽绑定到某些列索引。模型说要查看特定列应该显示哪些数据,以及列的宽度应该是多少。此外,headerData() 适用于标题高度,但不适用于宽度。也许我应该调整 QTableView 或 QHeaderVew 的一些属性以正确应用 sizeHint?
      【解决方案4】:

      为水平和/或垂直标题添加一行或两行:

      Qt 4:

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

      Qt 5:

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

      【讨论】:

      • 没有这样的QHeaderView::setResizeMode ??
      • 如果您在当前的库代码中没有找到一些示例(很可能是由其他人而非 M.Kanan 提供的),则不是投入的理由 - 我更新了答案以匹配 Qt 4 和 5
      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2014-12-28
      • 2010-09-16
      • 2015-03-10
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      相关资源
      最近更新 更多