Qt - есть ли способ превратить графический элемент в растровое изображение? - PullRequest
0 голосов
/ 15 мая 2018

Я хочу создать растровое изображение из графического объекта, поэтому я могу установить растровое изображение в виде значка

У меня есть класс Block, полученный из QGraphicsPathItem, и я попытался использовать:

Block *block = new Block();

QRect rect = block->boundingRect().toRect();

QPixmap pixmapItem;
pixmapItem.copy(rect);

QListWidgetItem *item = new QListWidgetItem;
item->setIcon(QPixmap(pixmapItem));

но растровое изображение кажется пустым.

Есть ли способ получить изображение / значок из graphicObject или graphicItem?

Ответы [ 4 ]

0 голосов
/ 11 августа 2019

Спасибо за хороший пример @ eyllanesc .Кроме того, команда перевода также обязательна в некоторых случаях.

 static QPixmap QPixmapFromItem(QGraphicsItem *item){
            QPixmap pixmap(item->boundingRect().size().toSize());
            pixmap.fill(Qt::transparent);
            QPainter painter(&pixmap);
            painter.setRenderHint(QPainter::Antialiasing);
            QStyleOptionGraphicsItem opt;
            painter.translate (-1 * (item->boundingRect ().topLeft ()));//THIS IS MANDATORY IN SOME CASES.
            item->paint(&painter, &opt);
            return pixmap;
        }
0 голосов
/ 15 мая 2018

Вы должны использовать paint() метод QGraphicsItem, чтобы получить рендеринг:

static QPixmap QPixmapFromItem(QGraphicsItem *item){
    QPixmap pixmap(item->boundingRect().size().toSize());
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
    painter.setRenderHint(QPainter::Antialiasing);
    QStyleOptionGraphicsItem opt;
    item->paint(&painter, &opt);
    return pixmap;
}

Пример:

#include <QApplication>
#include <QGraphicsPathItem>
#include <QGraphicsView>
#include <QHBoxLayout>
#include <QListWidget>

static QPixmap QPixmapFromItem(QGraphicsItem *item){
    QPixmap pixmap(item->boundingRect().size().toSize());
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
    painter.setRenderHint(QPainter::Antialiasing);
    QStyleOptionGraphicsItem opt;
    item->paint(&painter, &opt);
    return pixmap;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QHBoxLayout lay(&w);
    QListWidget listWidget;
    QGraphicsView view;
    QGraphicsScene scene;
    view.setScene(&scene);

    int counter = 0;
    for(const QColor & color : {QColor("red"), QColor("blue"), QColor("green")}){
        QPainterPath p;
        p.addRoundedRect(0, 0, 150, 50, 2, 2);
        QGraphicsPathItem *block = scene.addPath(p);
        block->setBrush(QBrush(color));
        block->setFlag(QGraphicsItem::ItemIsMovable);
        block->setFlag(QGraphicsItem::ItemIsSelectable);
        block->setPos(counter*QPointF(10, 10));

        // get QPixmap from item
        QPixmap pixmap = QPixmapFromItem(block); 

        QListWidgetItem *l_item = new QListWidgetItem(color.name());
        listWidget.addItem(l_item);
        l_item->setIcon(QIcon(pixmap));
        counter++;
    }
    lay.addWidget(&listWidget);
    lay.addWidget(&view);
    w.show();
    return a.exec();
}

enter image description here

0 голосов
/ 15 мая 2018

Это потому, что ограничивающий прямоугольник содержит только информацию о координатах и ​​размере вашего QGraphicsItem, но не дает дополнительной информации о том, как его нарисовать.

Вы можете попробовать что-то похожее на следующее: Создайте QImage вашего block размера и используйте его для инициализации QPainter. QPainter может затем использоваться block для рисования на изображении. Это достигается с помощью метода paint, который Block наследуется от QGraphicsItem

Block *block = new Block();
QSize size = block->boundingRect().toRect().toSize();
QImage* image = new QImage(size, QImage::Format_RGB32);
QPainter* painter = new QPainter(image);
block->paint(painter, new StyleOptionGraphicsItem());

Тогда ваш block должен быть окрашен в image.

0 голосов
/ 15 мая 2018

Должно быть возможно использовать QGraphicsItem::paint для этого:

QSize itemSize = item->boundingRect()
QPixmap targetPixmap(item->boundingRect().size().toSize());

QPainter pixmapPainter(&targetPixmap);
QStyleOptionGraphicsItem styleOption;
item->paint(&pixmapPainter, &styleOption);
...