You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QGraphicsView中paint函数未调用求助:自定义树形节点无法显示

问题分析与修复方案

核心错误1:QGraphicsScene为局部变量

你的MainWindow代码里,QGraphicsScene scene是局部对象,这段代码执行完毕后,scene会被立即销毁。哪怕你已经把根节点添加到场景、给视图绑定了场景,scene销毁后视图没有有效的场景数据,自然不会触发paint函数。

修复方式:将scene改为堆分配或类成员变量,比如:

// 改为堆分配(或作为MainWindow的成员变量)
QGraphicsScene* scene = new QGraphicsScene();
view = new QGraphicsView(scene);
scene->addItem(root);
root->setPos(100, 100);

核心错误2:在paint函数中创建子节点

paint函数仅用于绘制当前图形项的内容,绝对不能在paint里创建新的QGraphicsItem。这种做法会导致每次触发paint都重复生成节点,打乱Qt的图形项管理逻辑,还会引发内存泄漏。

修复方式:

  1. 提前遍历Family_tree的所有节点,创建对应的TreeViewNode并统一添加到场景
  2. 节点间的连线单独处理:可以自定义QGraphicsLineItem绘制父子连线,或者在TreeViewNode的paint中只绘制自身内容,连线逻辑放在外部实现

其他必要补充

  • 确保TreeViewNode的构造函数正确初始化m_node,且m_node->getPatient().get_Name()能返回有效字符串
  • 调用view->show()确保视图被显示(你的代码里缺少这一步,也是视图空白的可能原因)

修正后的MainWindow代码示例:

// MainWindow.cpp
TreeViewNode* root = new TreeViewNode(family->get_root());
QGraphicsScene* scene = new QGraphicsScene(this); // 作为MainWindow子对象,自动管理内存
QGraphicsView* view = new QGraphicsView(scene, this);
scene->addItem(root);
root->setPos(100, 100);
view->resize(400, 400); // 设置视图尺寸
view->show(); // 显示视图

修正后的paint函数示例:

void TreeViewNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
    qDebug() << "Paint function called";
    // 仅绘制当前节点的内容
    painter->drawRect(boundingRect());
    painter->drawText(boundingRect(), Qt::AlignCenter, QString::fromStdString(m_node->getPatient().get_Name()));
}

内容的提问来源于stack exchange,提问作者Nancy Kalaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:55:34