QTreeView не показывает ни одного элемента при использовании оболочки между моделью и представлением - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь создать в GitAhead другой вид файлов diff. Они уже предоставляют Treemodel, которая отлично работает. Я пытаюсь поместить оболочку между моделью и представлением, чтобы показать только измененные файлы. На данный момент я хотел бы просто переслать модель, но вид ничего не показывает. rowCount () вызывается нормально, а затем вызывается index (), но data () никогда не вызывается. Кто-нибудь знает, почему я не могу переслать модель?

TreeWrapper.h:

#include "TreeWrapper.h"
#include "TreeModel.h"
#include "conf/Settings.h"
#include "git/Blob.h"
#include "git/Diff.h"
#include "git/RevWalk.h"
#include "git/Submodule.h"
#include <QStringBuilder>
#include <QUrl>

namespace {

const QString kLinkFmt = "<a href='%1'>%2</a>";

} // anon. namespace

TreeWrapper::TreeWrapper(TreeModel* model, QObject *parent):
    mModel(model),
    QAbstractItemModel(parent)
{

}

TreeWrapper::~TreeWrapper()
{
}

void TreeWrapper::setTree(const git::Tree &tree, const git::Diff &diff)
{
  beginResetModel();

  mModel->setTree(tree, diff);

  endResetModel();
}

int TreeWrapper::rowCount(const QModelIndex &parent) const
{
int count = mModel->rowCount(parent);
  return count;
}

int TreeWrapper::columnCount(const QModelIndex &parent) const
{
  return mModel->columnCount(parent);
}

bool TreeWrapper::hasChildren(const QModelIndex &parent) const
{
    bool children = mModel->hasChildren(parent);
  return children;
}

QModelIndex TreeWrapper::parent(const QModelIndex &index) const
{
  return mModel->parent(index);
}

QModelIndex TreeWrapper::index(
  int row,
  int column,
  const QModelIndex &parent) const
{
    QModelIndex index = mModel->index(row, column, parent);
    bool valid = index.isValid();
    return index;
}

QVariant TreeWrapper::data(const QModelIndex &index, int role) const
{
  return mModel->data(index, role);
}

bool TreeWrapper::setData(
  const QModelIndex &index,
  const QVariant &value,
  int role)
{
  return mModel->setData(index, value, role);
}

Qt::ItemFlags TreeWrapper::flags(const QModelIndex &index) const
{
  return mModel->flags(index);
}

TreeWrapper.h:

#ifndef TREEWRAPPER
#define TREEWRAPPER

#include "git/Diff.h"
#include "git/Index.h"
#include "git/Tree.h"
#include "git/Repository.h"
#include <QAbstractItemModel>
#include <QFileIconProvider>

class TreeModel;

class TreeWrapper : public QAbstractItemModel
{
  Q_OBJECT

public:
  TreeWrapper(TreeModel* model, QObject *parent = nullptr);
  virtual ~TreeWrapper();

  void setTree(const git::Tree &tree, const git::Diff &diff = git::Diff());

  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
  int columnCount(const QModelIndex &parent = QModelIndex()) const override;
  bool hasChildren(const QModelIndex &parent = QModelIndex()) const override;

  QModelIndex parent(const QModelIndex &index) const override;
  QModelIndex index(
    int row,
    int column,
    const QModelIndex &parent = QModelIndex()) const override;

  QVariant data(
    const QModelIndex &index,
    int role = Qt::DisplayRole) const override;
  bool setData(
    const QModelIndex &index,
    const QVariant &value,
    int role = Qt::EditRole) override;

  Qt::ItemFlags flags(const QModelIndex &index) const override;

private:
  TreeModel* mModel{nullptr};
};

#endif // TREEWRAPPER

Нижнее древовидное представление использует непосредственно древовидную модель, в верхнем - я бы хотел поместить Оболочку между моделью и представлением. enter image description here

1 Ответ

0 голосов
/ 10 апреля 2020

Я решил проблему, поместив QSortFilterProxyModel между моделью и представлением: https://github.com/Murmele/gitahead/blob/AlternativeTreeView/src/ui/TreeProxy.cpp

Этот прокси используется дважды. Один раз прокси отфильтровывает сцену и незадействованный участок.

...