更换QPen - 如何删除

时间:2012-10-29 17:59:16

标签: c++ qt

我正在开发一个GUI,允许用户在背景图片上使用鼠标/ QSpinBox事件修改省略号。

我想进行设置,以便当用户点击椭圆时,椭圆会改变颜色并被“选中”。

我正在使用QGraphicsView / Scene和QGraphicsEllipseItem。这就是我的问题,setPen(QPen & const)调用是一个参考:

  • 如果我在堆栈上分配笔并将其传入,我会遇到段错误。
  • 如果我在堆上分配笔,则在设置新笔时不会删除它
  • 存取方法返回笔的副本

无论如何,我必须接近这个错误,可以提出任何建议吗?

P.S。 - 我想避免制作另一个成员变量。我将有许多省略号,每个省略号都不应该有自己的笔变量!


此代码将导致段错误:

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.
}

1 个答案:

答案 0 :(得分:2)

  

如果我在堆栈上分配笔并将其传入,我会遇到段错误。

这是正确的方法 - 如果你得到一个段错误,那肯定不是由于QPen。 发布代码和调试器堆栈跟踪。

每个QGraphicsEllipseItem都会存储QPen的(轻量级)副本,因此在堆上创建QPen实例是没有意义且容易出错的。 不要担心太多的QPen实例。 QPen使用implicit sharing,即如果您共享相同的未经修改的笔,则副本便宜。