1

私は、ユーザーが背景画像の上でマウス/QSpinBoxイベントを使用して省略記号を変更できるようにするGUIを開発しています。

ユーザーが楕円をクリックすると、楕円の色が変わり、「選択」されるように設定したいと思います。

QGraphicsEllipseItemでQGraphicsView/Sceneを使用しています。ここに私の問題があります、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 に答える