树视图的列数混淆

时间:2014-02-19 12:20:58

标签: c++ qt

在以下示例中,每个子项目只有1列,但应该有2列。

(MyTreeModel是QAbstractItemModel的子类。)

int MyTreeModel::columnCount( const QModelIndex &rParent /*= QModelIndex()*/ ) const
{
    if (rParent.isValid())
    {
           return 2;
    }
    else
    {
        return 1;
    }
}

在以下示例中,QTreeView按预期显示父项的2列和子项的1列。

int MyTreeModel::columnCount( const QModelIndex &rParent /*= QModelIndex()*/ ) const
{
    if (rParent.isValid())
    {
           return 1;
    }
    else
    {
        return 2;
    }
}

因此,似乎子项的列数受其父项的列号限制。这是标准行为吗?我做错了吗?

1 个答案:

答案 0 :(得分:4)

我在https://qt.gitorious.org/检查了源代码(当前没有替代https://github.com/qtproject/qtbase/blob/dev/src/widgets/)并找到了如下答案:

  1. 我检查了方法void QTreeView::setModel(QAbstractItemModel *model)。在那里我注意到了行d->header->setModel(model);。标题是你需要的。
  2. Type of header,它是QHeaderView
  3. 然后我检查了方法void QHeaderView::setModel(QAbstractItemModel *model)
  4. 建立了连接:QObject::disconnect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)), this, SLOT(sectionsInserted(QModelIndex,int,int)));
  5. 我做的最后一件事是阅读插槽方法void QHeaderView::sectionsInserted(const QModelIndex &parent, int logicalFirst, int logicalLast)
  6. 猜猜我在那里找到了什么:

    void QHeaderView::sectionsInserted(const QModelIndex &parent,
    int logicalFirst, int logicalLast)
    {
        Q_D(QHeaderView);
        if (parent != d->root)
            return; // we only handle changes in the top level
    

    因此,只有顶级项目会对列数产生影响。