2013-07-26 437 views
8

私はQt/Embeddedの初心者です。私はQPixmapに物を描くのにQPainterを使って、QGraphicsSceneに追加したいと思います。ここに私のコードです。しかし、ピクスマップに図面は表示されません。これは、黒のpixmapのみを表示します。QPixmapのQPixmapの使い方

int main(int argc, char **argv) { 

    QApplication a(argc, argv); 

    QMainWindow *win1 = new QMainWindow(); 
    win1->resize(500,500); 
    win1->show(); 


    QGraphicsScene *scene = new QGraphicsScene(win1); 
    QGraphicsView view(scene, win1); 
    view.show(); 
    view.resize(500,500); 

    QPixmap *pix = new QPixmap(500,500); 
    scene->addPixmap(*pix); 

    QPainter *paint = new QPainter(pix); 
    paint->setPen(*(new QColor(255,34,255,255))); 
    paint->drawRect(15,15,100,100); 

    return a.exec(); 
} 
+4

'paint-> setPen(*(新QColor(255,34,255,255)));'どのような恐ろしいメモリリーク!ちょうど 'paint-> setPen(QColor(255,34,255,255));' –

+0

QPainterのリークもまたスタック上で使用されると思われます。 –

答えて

8

QPixmapは、newキーワードなしで作成する必要があります。これは通常、ポインタではなく、値または参照によって渡されます。その理由の1つは、QPixmapはその変更を追跡できないということです。 addPixmapを使用してシーンにピックスマップを追加すると、現在のピックスマップだけが使用されます。さらなる変更はシーンに影響を与えません。変更後、addPixmapに電話する必要があります。

また、pixmapを使用してすべての変更がピクスマップに書き込まれ、メモリリークが発生しないようにするには、QPainterを破棄する必要があります。

QPixmap pix(500,500); 
QPainter *paint = new QPainter(&pix); 
paint->setPen(QColor(255,34,255,255)); 
paint->drawRect(15,15,100,100); 
delete paint; 
scene->addPixmap(pix); 
+0

'QPainter :: begin'と' QPainter :: end'の間で 'QPainter'呼び出しをカプセル化するのではなく、それをカプセル化するのと同じですか? – nkint

+1

'begin'がコンストラクタで自動的に呼び出されます。オブジェクトを削除することなく 'end'を呼び出すことができ、後で' begin'を呼び出してオブジェクトを再利用することができます。もちろん、あなたは最終的にそれを破壊する必要があります。しかし 'QPainter'を' new'なしで作成して自動的に削除する方が便利です。同じペインタを2つのペイントアクションの間に保つことに意味はありません。画家を作ることは安い操作です。 –

12

あなたがシーンに追加前に、ビットマップに塗装を行う必要があります。シーンに追加すると、シーンはQGraphicsPixmapItemオブジェクトを構築するためにそれを使用します。このオブジェクトはaddPixmap()関数によっても返されます。追加した後にピックスマップを更新する場合は、返されたQGraphicsPixmapItemオブジェクトのsetPixmap()関数を呼び出す必要があります。だから、

次のいずれか

... 
QPixmap *pix = new QPixmap(500,500); 
QPainter *paint = new QPainter(pix); 
paint->setPen(*(new QColor(255,34,255,255))); 
paint->drawRect(15,15,100,100); 
scene->addPixmap(*pix); // Moved this line 
... 

か:

... 
QPixmap *pix = new QPixmap(500,500); 
QGraphicsPixmapItem* item(scene->addPixmap(*pix)); // Save the returned item 
QPainter *paint = new QPainter(pix); 
paint->setPen(*(new QColor(255,34,255,255))); 
paint->drawRect(15,15,100,100); 
item->setPixmap(*pix); // Added this line 
...