我正在开发一个GUI,它将允许用户使用背景图片顶部的mouse / QSpinBox事件修改椭圆。

我要进行设置,以便当用户单击椭圆时,椭圆会更改颜色并已被“选中”。

我正在将QGraphicsView / Scene与QGraphicsEllipseItem一起使用。这就是我的问题所在,因此setPen(QPen & const)调用是一个引用:

  • 如果我在堆栈上分配一支笔并将其传递进去,则会出现段错误。
  • 如果我在堆上分配了一支笔,则在设置新笔时不会被删除
  • 访问器方法返回笔
  • 的副本

    无论如何,我一定要解决这个错误,有什么建议吗?

    附言-我想避免设置ANOTHER成员变量。我将有许多椭圆,每个椭圆都不应该有自己的笔变量!

    此代码将导致段错误:
    void MyClass::SetupEllipses()
    {
        QPen pen();
        pen.setColor(QColor(255,0,0));
        pen.setWidth(2);
    
        m_ellipse = new QGraphicsItemEllipse(); //This is a member variable of MyClass
        m_ellipse->setRect(some ssize here);
        m_ellipse->setPen(pen);
    
        m_graphicsview->scene()->addItem(m_ellipse); //m_graphicsview is also a member variable of MyClass and has had a scene added to it.
    }
    

    最佳答案



    这是正确的方法-如果遇到段错误,那肯定不是QPen造成的。
    发布您的代码和调试器堆栈跟踪。

    无论如何,每个QGraphicsEllipseItem都将存储QPen的(轻量级)副本,因此在堆上创建QPen实例是荒谬的且容易出错。
    不用担心太多的QPen实例。 QPen使用implicit sharing,即,如果您共享同一根未修改的笔,则副本便宜。

    10-06 01:44