gpt4 book ai didi

c++ - QAbstractItemModel data() 永远不会被调用

转载 作者:可可西里 更新时间:2023-11-01 18:37:15 26 4
gpt4 key购买 nike

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

下面是 View 所在的主窗口的代码。

#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();
}

我应该提到标题确实显示这个模型。然而,即使我设置了一个项目,除了标题之外,小部件中什么也没有显示。

哦,NeuralNetworkNeuralNode 的子节点。

最佳答案

问题是这个片段:

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

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

只要放下这张支票,它就会起作用。 nodeFromIndex 似乎正确处理了根节点。

关于c++ - QAbstractItemModel data() 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com