【问题标题】:QTreeView custom row height of individual rowsQTreeView 自定义行高的各个行
【发布时间】:2015-01-09 11:51:51
【问题描述】:

是否可以重新定义 QTreeView 中某些单独行的行高?

我有一个自定义QTreeView、自定义QAbstractItemModel 和一个自定义QStyledItemDelegate,但似乎所有sizeHint 方法要么只调用一次(最初),要么在基类中不是虚拟的。

Qt 版本 4.7.4,无法升级到 5。

任何帮助表示赞赏。

【问题讨论】:

  • 有 SizeHintRole,当这个角色请求时,尝试在你的 data() 方法中返回 QSize(int,int)。
  • 同样的行为:data() 方法只在设置了 SizeHintRole 的情况下被调用一次!
  • 因此,如果您需要再次调用数据来更新某些内容,那么通常的做法是从模型中发出带有所需 QModelIndex 的 dataChanged 信号,不是吗?
  • 也许我不够明确。带有SizeHintRole 集的QAbstractItemModel::data() 方法只对整个树调用一次,而不是像预期的那样对每个项目调用一次。是的,一旦模型中的数据发生变化,我就会发出dataChanged 信号。目前,模型仅在初始化期间更改一次。

标签: qt qt4 qt5


【解决方案1】:

重新实现委托的 sizeHint()。在我的一些生产代码中找到了一个示例。它在下面被简化显示。在示例中,树可能包含图像。因此,需要调整单元格大小以承载图像。

class ItemDelegate : public QItemDelegate
{
  public:
      QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
      {
           const TreeItem* ti(static_cast<TreeItem*>(index.internalPointer()));
           if(ti->pixmap())
              return ti->pixmap()->size();
           QItemDelegate::sizeHint(option,index);
      }
};

用法:

 QTreeView view;
 ItemDelegate *delegate = new ItemDelegate;
 view.setItemDelegate(delegate);

【讨论】:

  • 我已经重新实现了sizeHint 方法。问题是这个方法只为完整的树调用一次(即只为根QModelIndex),这样所有的行都具有相同的大小。
  • @SaZ:你是对的。事实上,这可能就是答案。
  • @SaZ:你是对的,我一定是不小心将uniformRowHeight 属性设置为true。关闭它解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2015-11-20
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多