QAbstractItemModel data()永远不会被调用



我正在尝试创建一个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();
}

来自视图所在的主窗口的代码在下面。

#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    NeuralNetwork* network = new NeuralNetwork();
    modelNeural = new ModelItemNeural();
    modelNeural->setRootNode(network);
    ui->treeView->setModel(modelNeural);
    update();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_actionNew_triggered()
{
    NeuralNetwork* network = new NeuralNetwork();
    modelNeural->setRootNode(network);
    ui->treeView->update();
}
我应该提到头确实显示了这个模型的。但是,即使我设置了一个项,小部件中也没有显示任何内容,只显示标题。

Oh, NeuralNetworkNeuralNode的子。

问题是这个片段:

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

你基本上是在说根节点(由无效的父索引指示)有零个子节点,即模型有零顶级行。因此视图不再查询。

把这张支票放下就行了。nodeFromIndex似乎正确处理根节点

您必须在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); }

是否添加了模型(而不是项目)到treeview控件?您是否创建了派生类型的项并将它们添加到模型中?如果您的模型正在被访问,应该调用Data()。

相关内容

  • 没有找到相关文章

最新更新