Qt 如何在QPixmap上使用QPainter
我是Qt/Embedded的新手。我想使用Qt 如何在QPixmap上使用QPainter,qt,qt4,qgraphicsscene,qpainter,qpixmap,Qt,Qt4,Qgraphicsscene,Qpainter,Qpixmap,我是Qt/Embedded的新手。我想使用QPainter在QPixmap上绘制东西,它将被添加到qgraphicscene。这是我的密码。但它不会在pixmap上显示图形。它只显示黑色的像素贴图 int main(int argc, char **argv) { QApplication a(argc, argv); QMainWindow *win1 = new QMainWindow(); win1->resize(500,500); win1->show(
QPainter
在QPixmap
上绘制东西,它将被添加到qgraphicscene
。这是我的密码。但它不会在pixmap上显示图形。它只显示黑色的像素贴图
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();
}
QPixmap
应在不使用new
关键字的情况下创建。它通常通过值或引用传递,而不是指针。原因之一是QPixmap
无法跟踪其更改。使用addPixmap
将pixmap添加到场景时,仅使用当前的pixmap。进一步的更改不会影响场景。因此,在进行更改后,应该调用addPixmap
您还需要在使用pixmap之前销毁qPaint
,以确保所有更改都将写入pixmap并避免内存泄漏
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);
在将位图添加到场景之前,需要在位图上进行绘制。将其添加到场景中时,场景将使用它构造一个
QGraphicsPixmapItem
对象,该对象也由addPixmap()
函数返回。如果要在添加pixmap后更新它,则需要调用返回的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
...
或:
封装
QPainter::begin
和QPainter::end
之间的QPainter
调用而不是销毁它是否相同?begin
在构造函数中自动调用。您可以在不删除对象的情况下调用end
,稍后调用begin
以重用该对象。当然,总有一天你会毁掉它的。但是创建QPainter
而不创建new
更方便,可以自动删除它。在两次绘画动作之间保留同一个画家是没有意义的。建造油漆工是一种廉价的操作。这个答案对我很有帮助。在更新QPixmap
value实例之后,我意外地调用了QPainter::end()
。这导致了难以修复的分段故障。是的,QPixmap
通常使用new
关键字创建,但ctorQPainter(PaintDevice*)
(或方法begin(PaintDevice*)
)需要指针。使用指向QPixmap
的值实例的指针时要小心<代码>绘制->设置笔(*(新QColor(255,34255255))代码>多么可怕的内存泄漏!只要做paint->setPen(QColor(255,34255255))代码>QPainter也会泄漏,它也应该用于堆栈。
...
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
...