Нарисуйте QGraphicsItem в QImage без необходимости сцены / представления - PullRequest
1 голос
/ 24 марта 2012

Итак, вот что я пытаюсь сделать: используя собственный QGraphicsItem, у меня есть настройки QPainter для рисования в QImage, который я затем сохраняю в файл (или просто сохраняю QImage в памяти, пока он мне не понадобится).

Проблема, которую я обнаружил, заключается в том, что QGraphicsItem :: paint () вызывается, только если QGraphcsItem принадлежит сцене, сцена принадлежит представлению, И представление и сцена не скрыты.

Вот код вне моего проекта для целей тестирования:

MyQGfx Class
void MyQGfx::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    qDebug() << "begin of paint function";
    QRectF rec = boundingRect();

    QImage image(boundingRect().size().toSize(),
                 QImage::Format_ARGB32_Premultiplied);
    image.fill(0);

    // construct a dedicated offline painter for this image
    QPainter imagePainter(&image);
    imagePainter.translate(-boundingRect().topLeft());

    // paint the item using imagePainter
    imagePainter.setPen(Qt::blue);
    imagePainter.setBrush(Qt::green);
    imagePainter.drawEllipse(-50, -50, 100, 100);

    imagePainter.end();


    if(image.save("C://plot.jpg"))
    {
        qDebug() << "written";
    }
    else {
        qDebug() << "not written";
    }
}

MainWindow Class
....
QGraphicsView* view = new QGraphicsView(this);
QGraphicsScene* scene = new QGraphicsScene(this);
view->setScene(scene);

MyQGfx* gfx = new MyQGfx();
scene->addItem(gfx);
gfx->update();
....

Все это прекрасно работает, но я не хочу, чтобы представление / сцена были необходимы, так как это будет отображаться в главном окне- есть ли способ обойти это?

1 Ответ

2 голосов
/ 25 марта 2012

Разве вы не можете просто создать собственный метод, принимающий QPainter, одну картину на QImage и одну на вашем предмете?

...