不同列宽的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的主要内容,如果未能解决你的问题,请参考以下文章