1

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

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

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

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

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

PS - 我想避免制作另一个成员变量。我将有很多椭圆,每个椭圆都不应该有自己的笔变量!


此代码将导致段错误:

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

1 回答 1

2

如果我在堆栈上分配一支笔并将其传入,则会出现段错误。

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

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

于 2012-10-29T19:31:59.047 回答