o18_99_1 2024-05-12 22:01 采纳率: 44.4%
浏览 29

QGraphicsScene通过items返回子项列表,然后访问里面的成员变量导致程序奔溃

img

通过这种形式调用Resize,在该函数中访问成员变量时奔溃

img

70行那里,为啥会这样,正常构造使用没问题

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-12 22:01
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】:您遇到的问题是在Qt框架中,使用QGraphicsSceneitems()方法遍历场景中的所有项,并调用每个项的Resize方法来更新它们的大小时,程序崩溃。您想要找出导致崩溃的原因,并解决这个问题。

    【图片内容】:

    1. 第一张图片展示了您在遍历QGraphicsScene中的所有项,并调用Resize方法的代码片段。
    2. 第二张图片展示了MessageItem::Resize方法的实现,这个方法用于调整MessageItem对象的大小。

    【问题出现原因】:根据您提供的代码和描述,问题可能出现在以下几个方面:

    • 在遍历QGraphicsSceneitems()时,可能存在一些不是MessageItem类型的QGraphicsItem,使用qgraphicsitem_cast进行类型转换时,如果转换失败,i将是一个空指针。
    • Resize方法中,如果m_text为空或者存在其他问题,导致horizontalAdvance方法失败,可能会使程序崩溃。

    【问题解决方案】:为了避免程序崩溃,您需要确保类型转换成功,并且在访问成员变量之前进行适当的检查。以下是一些可能的解决方案:

    1. 确保类型转换成功:

      for (QGraphicsItem *item : scene->items()) {
          if (MessageItem *i = qgraphicsitem_cast<MessageItem*>(item)) {
              i->Resize(newSize.width());
          }
      }
      
    2. Resize方法中添加对m_text的检查:

      QSize MessageItem::Resize(int width) {
          if (m_text.isEmpty()) {
              return QSize(0, 0); // 或者设置一个默认值
          }
          // ... 其余代码
      }
      

    【提供代码】:您需要在原有的代码基础上进行上述修改。

    【代码运行方式】:您需要在Qt开发环境中编译并运行修改后的代码。

    【代码预期运行结果】:程序不会崩溃,并且能够正确地更新MessageItem的大小。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月12日
  • 创建了问题 5月12日