2013-07-26 93 views
8

Tôi là người mới thành Qt/Embedded. Tôi muốn sử dụng QPainter để vẽ các thứ trên QPixmap, sẽ được thêm vào QGraphicsScene. Đây là mã của tôi. Nhưng nó không hiển thị các bản vẽ trên pixmap. Nó chỉ hiển thị bản đồ đen.Cách sử dụng QPainter trên 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 (* (mới QColor (255,34,255,255))); 'gì một rò rỉ bộ nhớ khủng khiếp! Chỉ cần làm 'paint-> setPen (QColor (255,34,255,255)); ' –

+0

QPainter bị rò rỉ quá, nó cũng giả sử được sử dụng trên stack. –

Trả lời

8

QPixmap phải được tạo mà không cần new từ khóa. Nó thường được chuyển qua giá trị hoặc tham chiếu, không phải bởi con trỏ. Một trong những lý do là QPixmap không thể theo dõi các thay đổi của nó. Khi bạn thêm một bản đồ vào một cảnh bằng cách sử dụng addPixmap, chỉ có bản đồ hiện tại được sử dụng. Các thay đổi khác sẽ không ảnh hưởng đến cảnh. Vì vậy, bạn nên gọi addPixmap sau khi bạn thực hiện thay đổi.

Ngoài ra, bạn cần hủy QPainter trước khi sử dụng pixmap để đảm bảo rằng tất cả các thay đổi sẽ được ghi vào pixmap và để tránh rò rỉ bộ nhớ.

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

cũng giống như việc gói gọn các cuộc gọi 'QPainter' giữa' QPainter :: begin' và 'QPainter :: end' thay vì phá hủy nó? – nkint

+1

'bắt đầu' được gọi tự động trong hàm tạo. Bạn có thể gọi 'kết thúc' mà không xóa đối tượng và gọi' bắt đầu' sau để sử dụng lại đối tượng. Tất nhiên, cuối cùng bạn phải tiêu diệt nó một thời gian. Nhưng thuận tiện hơn khi tạo 'QPainter' mà không có' new' để tự động xóa nó. Không có điểm nào trong việc bảo quản cùng một họa sĩ giữa hai hành động sơn. Xây dựng họa sĩ là một hoạt động giá rẻ. –

12

Bạn cần phải làm những bức tranh trên bitmap trước bạn thêm nó vào bối cảnh đó. Khi bạn thêm nó vào cảnh, cảnh sẽ sử dụng nó để xây dựng một đối tượng QGraphicsPixmapItem, cũng được trả về bởi hàm addPixmap(). Nếu bạn muốn cập nhật pixmap sau khi nó đã được thêm vào, bạn cần gọi hàm setPixmap() của đối tượng trả về QGraphicsPixmapItem.

Vì vậy, một trong hai:

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

hay:

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