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的图形项管理逻辑,还会引发内存泄漏。
修复方式:
- 提前遍历Family_tree的所有节点,创建对应的TreeViewNode并统一添加到场景
- 节点间的连线单独处理:可以自定义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
相关产品推荐
相关产品推荐

