不同列宽的QTableView

Posted

技术标签:

【中文标题】不同列宽的QTableView【英文标题】:QTableView with different column width 【发布时间】:2015-12-24 04:23:52 【问题描述】:

我在应用程序中有一个QTableView 宽度QAbstractTableModel,我想让每列具有不同的宽度,并带有调整大小选项ui->tableView->horizontalHeader()->setSectionResizeMode (QHeaderView::Stretch);

在我的模型中我这样做:

    class rangeModel : public QAbstractTableModel 
    //other code ....... 

    QVariant rangeModel::headerData(int section, Qt::Orientation orientation, int role) const
    
        if (orientation != Qt::Horizontal) 
            return QVariant();
        if (role != Qt::DisplayRole && role != Qt::SizeHintRole) 
            return QVariant();
        if(role == Qt::SizeHintRole) 
        
           switch (section) 
              case 0: return QSize(58, 20);
              case 1: return QSize(58, 20);
              case 2: return QSize(58, 20);
              case 3: return QSize(228, 20);
           
        
        switch (section) 
            case 0: return "PREFIXMIN";
            case 1: return "PREFIXMAX";
            case 2: return "VALUE";
            case 3: return "PROGRESS BAR";
            default: return QVariant();
        
    

所以我希望我的行大小不同,但它不会发生,视图由于某种原因忽略了QSizeHint,而且即使没有QHeaderView::Stretch 选项它也不起作用。如何使列和标题的大小不同?

【问题讨论】:

我怀疑,你可以用 QTableView 做到这一点,但你可以为此编写自己的视图。你可以通过继承qabstractitemview来编写自己的视图 @sanjay 所以我需要继承 qabstractitemview 并重新实现QAbstractItemView::sizeHintForColumn(int column) const 并返回我想要的大小?或者这还不够,我需要重新实现resizeEvent(QResizeEvent *event) 【参考方案1】:

你可能想用这个:

 ui->tableView->resizeColumnsToContents();//resize all the columns based on longest data in every column. 

但是,如果您确实打算使用您在代码中使用的宽度值精确调整它们的大小:

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

【讨论】:

您能解释一下您的答案如何解决问题中的问题吗?仅代码的答案不是很有用,特别是对于偶然发现这篇文章的更多读者。谢谢! 对不起。我假设,那一行代码是不言自明的。但我犯的另一个错误是,我假设他只是计算了他需要的宽度以适合列中的所有数据,这就是我推荐使用resizeColumnsToContents() 的原因。无论如何,我现在编辑了我的答案并包括了setColumnWidth(),以防他真的想设置那些特定的宽度。我没想到他从未尝试过setColumnWidth()函数。 不幸的是,只有在事先知道列数的情况下,才能设置列宽。 resizeColumnsToContents() 函数非常慢。如果可以动态添加列(这是 QAbstractTableModel 的主要目的之一),那么您必须继承 QTableView 或寻找其他替代方案。

以上是关于不同列宽的QTableView的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据表中设置某些列宽的列宽

如何制作具有固定列宽的 chrome 尊重表

如何在 Python 中打印具有指定列宽的列表?

将比文本列宽的表格居中

Excel快速删除空白行与调整行高列宽的方法,学会了很实用

匹配表格列宽的文本框