QAbstractItemModel data () НИКОГДА не вызывается - PullRequest
7 голосов
/ 23 июля 2011

Я пытаюсь создать QTreeView и использовать для него собственную модель.Я поместил qDebug() заявления в разных местах, и я определил, что data() - это , никогда не вызывается.Как я могу решить эту проблему?

Код модели ниже

#include "ModelItemNeural.h"

ModelItemNeural::ModelItemNeural(QObject *parent, NeuralNode *rootNode)
    : QAbstractItemModel(parent)
{
    this->rootNode = 0;
}

QModelIndex ModelItemNeural::index(int row, int column, const QModelIndex &parent) const
{
    // Out of bounds and null rootNode check.
    if (rootNode == 0 || row < 0 || column < 0)
    {
        return QModelIndex();
    }

    NeuralNode* parentNode = nodeFromIndex(parent);
    NeuralNode* childNode = parentNode->getInputs().value(row);

    if (childNode == 0)
    {
        return QModelIndex();
    }

    return createIndex(row, column, childNode);
}

QModelIndex ModelItemNeural::parent(const QModelIndex &child) const
{
    NeuralNode* node = nodeFromIndex(child);
    if (node == 0)
    {
        return QModelIndex();
    }

    NeuralNode* parentNode = node->getParent();
    if (parentNode == 0)
    {
        return QModelIndex();
    }

    NeuralNode* grandParentNode = parentNode->getParent();
    if (grandParentNode == 0)
    {
        return QModelIndex();
    }

    int row = grandParentNode->getInputs().indexOf(parentNode);
    return createIndex(row, 0, parentNode);
}

int ModelItemNeural::rowCount(const QModelIndex& parent) const
{
    if (parent.isValid() == false)
    {
        return 0;
    }

    if (parent.column() > 0)
    {
        return 0;
    }

    NeuralNode* parentNode = nodeFromIndex(parent);
    if (parentNode == 0)
    {
        return 0;
    }

    return parentNode->getInputs().length();
}

int ModelItemNeural::columnCount(const QModelIndex &parent) const
{
    return 2;
}

QVariant ModelItemNeural::data(const QModelIndex &index, int role) const
{
    qDebug() << "Data";
    if (index.isValid() == false)
    {
        return QVariant();
    }

    if (role != Qt::DisplayRole)
    {
        return QVariant();
    }

    NeuralNode* node = nodeFromIndex(index);
    if (node == 0)
    {
        return QVariant();
    }

    switch (index.column())
    {
        case 0:
        {
            // Stripping the name of the NeuralNode type.
            QString name = typeid(node).name();
            int index = name.indexOf(" ");
            if (index >= 0)
            {
                name = name.remove(0, index + 1);
            }

            qDebug() << "Name Column";
            return "Test";
            return name;
        }

        case 1:
        {
            qDebug() << "Value Column";
            return node->getWeight();
        }
    }

    return QVariant();
}

QVariant ModelItemNeural::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
    {
        switch (section)
        {
            case 0:
            {
                return "Node";
            }
            case 1:
            {
                return "Weight";
            }
        }
    }

    return QVariant();
}

NeuralNode * ModelItemNeural::nodeFromIndex(const QModelIndex &index) const
{
    if (index.isValid() == true)
    {
        //return (NeuralNode*)(index.internalPointer());
        return static_cast<NeuralNode *>(index.internalPointer());
    }
    else
    {
        return rootNode;
    }
}

void ModelItemNeural::setRootNode(NeuralNode *rootNode)
{
    delete this->rootNode;
    this->rootNode = rootNode;
    reset();
}

Код из главного окна, в котором находится вид, находится ниже.Следует отметить, что заголовок отображает для этой модели.Тем не менее, даже когда я устанавливаю элемент, в виджете ничего не отображается, за исключением заголовка.

Oh и NeuralNetwork - это подпункт NeuralNode.

Ответы [ 3 ]

5 голосов
/ 24 июля 2011

Проблема в следующем фрагменте:

int ModelItemNeural::rowCount(const QModelIndex& parent) const
{
    if (parent.isValid() == false)
    {
        return 0;
    }

Вы в основном говорите, что у корневого узла (обозначенного неверным родительским индексом) нет нулевых дочерних элементов, то есть модель имеет нулевые строки верхнего уровня. Таким образом, представление не запрашивает больше.

Просто бросьте эту проверку, и она должна работать. nodeFromIndex, кажется, правильно обрабатывает корневой узел.

0 голосов
/ 08 марта 2019

Вы должны переопределить следующий метод в своем унаследованном классе QAbstractItemModel:

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

Затем напишите это в:

return createIndex(row, column, nullptr);

Примерно так:

QModelIndex index(int row, int column, const QModelIndex &parent) const { return createIndex(row, column, nullptr); }

0 голосов
/ 24 июля 2011

Вы добавили модель (не элемент) в древовидный элемент управления? Вы создали элементы своего производного типа и добавили их в модель? Функция data () должна вызываться, если к вашей модели обращаются.

...