2015-12-24 34 views
0

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

在我的模型我做的:

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选项,它也不起作用。如何使列和标题大小不同?

+0

我怀疑,你可以用QTableView做到这一点,但你可以写你自己的看法。你可以通过继承qabstractitemview – sanjay

+0

@sanjay编写自己的视图,所以我需要继承qabstractitemview并重新实现'QAbstractItemView :: sizeHintForColumn(int column)const'并返回我想要的大小?或者这还不够,我将需要重新实现'resizeEvent(QResizeEvent * event)'? – Vladislav

回答

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); 
+0

你能否解释你的答案如何解决问题中的问题?仅有代码的答案并不是很有用,特别是对于那些偶然发现这篇文章的读者。谢谢! – Cristik

+0

对不起。我假定,那一行代码是自我解释的。但我做的另一个错误是,我认为他只是计算了自己需要的宽度以适合列中的所有数据,这就是为什么我建议使用'resizeColumnsToContents()'的原因。无论如何,我现在编辑我的答案,并包括'setColumnWidth()'incase他真的想要设置这些特定的宽度。我从来没有想到他从未尝试过'setColumnWidth()'函数。 –

+0

不幸的是,设置列宽仅适用于事先知道列数的情况。 resizeColumnsToContents()函数非常慢。如果列可以动态添加(这是QAbstractTableModel的主要目的之一),那么您必须对QTableView进行子类化或找到另一种替代方法。 – Ph0t0n