gpt4 book ai didi

c++ - QGraphicsPixmapItem

转载 作者:行者123 更新时间:2023-11-28 08:03:53 25 4
gpt4 key购买 nike

QGraphicsPixmapItem 和 QGraphicsItem 一样,有一个方法 update(x0, y0, width, height),以便仅在 QGraphicsScene 上部分重绘像素图。调用它会在 QGraphicsItem 上安排一个 paint()(在 Qt 的事件循环中),并且在执行此 paint() 之后,边界框(x,y,宽度,高度)将被重新绘制到 QGraphcisScene。

不幸的是,没有办法用边界框来安排绘画事件,这意味着 QGraphicsPixmapItem::paint() 被迫重新绘制整个 QPixmap,因此在子类中重新实现这个 paint() 方法给出无法仅部分更新 QPixmap,因此对 QPixmap 进行小的(本地)更新速度慢得令人无法接受。

这样的子类看起来像这样:

class LocallyUdatablePixmapItem : public QGraphicsPixmapItem {
private:
QImage ℑ
public:
LocallyUdatablePixmapItem(QImage &img) : QGraphicsPixmapItem(), image(img) {}

paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QStyle *widget) {
//locall update, unfortunately without a boundig box :( therefore -> slow
}
};

另一种选择是保留 QGraphicsPixmapItem 的“内部 QPixmap”,并将 QImage 部分绘制到它,如下所示:

//some initialization of variables
QGraphicsScene scene = ...;
QImage img = ...; //some image data that I wish to manipulate from time to time
QPixmap pixmap = QPixmap::fromImage(this->shown);
QPainter painter = new QPainter(&this->pixmap);
QGraphicsPixmapItem item = this->addPixmap(this->pixmap);
item->setPixmap(this->pixmap);
//this should not matter, but actually it does, as I will explain shortly
//delete painter;
//painter = new QPainter(item->pixmap());

//For some reason I decide to update (manimulate) img within a small boundigbox
int x0, y0, width, height; //bounding box, assume they are set to whatever is appropriate for the previous update
painter->drawImage (x0, y0, img, x0, y0, width, height);
//now the pixmap is updated, unfortunately the item is not. This does not affect it:
item->update(x0, y0, width, height);
//nor does this:
item->update();
//but this, which makes the whole thing slow, does:
item.setPixmap(&pixmap);

鉴于我需要设置像素图来修复它,我假设它在某种程度上没有在初始化中设置,因此取消之前提到的行的注释似乎是个好主意。不幸的是,drawImage() 调用随后出现段错误:

QPaintDevice: 无法破坏正在绘制的绘制设备

我想要一个替代“item.setPixmap(&pixmap);”的方法,它不会重绘整个内容,但效果很好。非常感谢任何输入:)

最佳答案

在我提出解决方案之前,有几点想法:

首先,Graphics View 框架旨在成为显示许 multimap 形对象的解决方案,因此一张大图像并不适合。当然,我知道你的例子可能只是一个人为的例子,所以这一点可能并不适用。其次,由于该框架非常以转换为中心,因此仅重绘 QGraphicsItem 的一部分可能没有意义,除非所有转换都是相同的,没有滚动等。

无论如何,如果您只想绘制 QGraphicsItem 的一部分,您可以简单地存储需要更新的矩形,并从您的 paint() 方法中访问它。例如:

CustomItem::setPaintRect(const QRectF &rect)
{
paintRect = rect;
update();
}

CustomItem::paint(QPainter *painter /* etc. */)
{
painter->fillRect(paintRect, brush);
}

关于c++ - QGraphicsPixmapItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10721935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com