2012-06-07 2 views
2

Я пытаюсь использовать QPainter для рисования элементов на QImage, но поскольку я не могу предсказать точный размер этого QImage, я не могу использовать QImage :: save() , он всегда говорил мне:Динамический QImage, если не задан начальный размер

QPainter::begin: Paint device returned engine == 0, type: 3

Но если указать ширину и высоту изображения при объявлении этого QImage, она работает гладко:

QImage output = QImage (500 , 500 , QImage::Format_ARGB32);

ответ

2

QImage, QPixmap, и т. д. требуют, чтобы данные были выделены до начала рисования. Использование конструктора по умолчанию QImage не выделяет никакой памяти, поэтому image.isNull() == true. Поэтому, когда вы вызываете QPainter::begin() (возможно, косвенно, создавая его с помощью QImage в качестве устройства рисования), он не может рисовать в любую память, потому что его нет.

Из QPainter::begin() документов:

QPixmap image(0, 0); 
painter->begin(&image); // impossible - image.isNull() == true; 

Таким образом, вы должны придумать с размером перед нанесением. В вашей ситуации лучше всего будет выбрать максимальный размер (или рассчитать один, если это возможно), а затем, как только вы узнаете точный размер - обрезайте изображение.

0

В качестве альтернативы, вы можете рисовать на QGraphicsScene, которая будет расширяться автоматически по мере добавления элементов на него, а затем сохранить только окрашенную область, данное QGraphicsScene::itemsBoundingRect():

QGraphicsScene scene; 
scene.addItem(...); 

QImage image(scene.itemsBoundingRect().size(), QImage::Format_ARGB32); 

QPainter painter(&image); 
scene.render(&painter, image.rect(), scene.itemsBoundingRect()); 
Смежные вопросы