我正在创建一个qml qt项目,它基于用户输入创建一个二进制文件,用于教育目的。你可以说我是qt新手,但我确实知道一些基本概念。我使用递归函数来创建一个二进制节点,其中包含用户输入的值。递归函数检查与二叉树的根节点一起输入的值,然后继续递归,直到它在树中找到位置,而不节点。我只计算了这个树的左边,所以它只适用于小于节点的值。下面是插入节点的算法:
void BinaryTree::insert_node(QQuickItem* parent_node, QString node_text) {
double node_value = node_text.toDouble();
root_node_value = parent_node->property("node_text").toInt();
if (node_value < root_node_value) {
if (!parent_node->property("has_left_node").toBool()) {
QQuickItem *left_node = create_binary_node(parent_node, node_text, "left_node");
QObject *node_anchors = qvariant_cast<QObject*>(left_node->property("anchors"));
node_anchors->setProperty("right", parent_node->property("right"));
node_anchors->setProperty("rightMargin", 60);
left_node->setProperty("id", "left_node");
left_node->setProperty("objectName", "left_node");
parent_node->setProperty("has_left_node", true);
} else {
QQuickItem* left_node = parent_node->findChild<QQuickItem*>("left_node");
if (left_node) {
insert_node(left_node, node_text);
} else {
std::cout << "left_node doesn't exist" << std::endl;
}
}
}
};
字符串
这个函数对于根节点和第二个节点都很好,但是对于第三个节点,它找不到创建的第二个节点,它只是打印“left_node doesn 't exist”。下面是我用来开始创建树和创建节点的函数:
void BinaryTree::create_node(QString node_text) {
if (node_count == 0) {
double node_value = node_text.toDouble();
QString node_id = "node_" + QString::number(node_count);
QQuickItem *node = qobject_cast<QQuickItem*>(node_component->create());
node->setParentItem(qobject_cast<QQuickItem*>(node_parent));
node->setProperty("node_text", node_text);
node->setProperty("id", node_id);
QObject *node_anchors = qvariant_cast<QObject*>(node->property("anchors"));
node_anchors->setProperty("horizontalCenter", node_parent->property("horizontalCenter"));
node_anchors->setProperty("top", node_parent->property("top"));
node_anchors->setProperty("topMargin", 10);
root_node = node;
root_node_value = node_value;
} else {
insert_node(root_node, node_text);
}
node_count++;
};
QQuickItem* BinaryTree::create_binary_node(QQuickItem* parent_node, QString node_text, QString node_id) {
QQuickItem* node = qobject_cast<QQuickItem*>(node_component->create());
node->setParentItem(parent_node);
node->setProperty("node_text", node_text);
node->setProperty("id", node_id);
node->setProperty("objectName", node_id);
QObject *node_anchors = qvariant_cast<QObject*>(node->property("anchors"));
node_anchors->setProperty("top", parent_node->property("top"));
node_anchors->setProperty("topMargin", 60);
return node;
}
型
正在创建的Node组件是一个qml文件,其中包含以下内容:
Rectangle {
width: 50
height: 50
radius: Math.min(width, height)/2
color: "cyan"
property string node_text
property bool has_right_node: false
property bool has_left_node: false
Text {
font.pixelSize: 12
anchors.centerIn: parent
text: node_text
}
}
型
我甚至不知道从哪里开始开始与这个问题,但我已经能够查明问题,无论是:
1.正在创建的节点超出范围,因此在函数的下一次迭代中无法找到它。
1.当创建节点时,在为节点分配对象名称时出现错误,为了解决这个问题,我重复了在函数外部添加对象名称和id的行。
我尝试过的其他事情是:
1.打印新创建的节点的属性,以确保它具有对象名称
1.添加if-else语句以检查查找子对象是否返回值
我会喜欢这个问题的解决方案,如果我需要改变我的问题请告诉我。
先谢谢你了。
1条答案
按热度按时间jmp7cifd1#
如果你想出了一个创造性的层次结构模型,如果你用递归的
Loader
实现,你可以把你的树逻辑移到QML:字符串
你可以Try it Online!
的数据