gpt4 book ai didi

c++ - 使用 QtConcurrent 加载 Pixmap 并绘制它

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:38 28 4
gpt4 key购买 nike

我正在尝试创建一个 Tile 渲染程序。这是一些基本代码。

标题

class Tile: public QGraphicsItem
{
public:
Tile(void);
~Tile(void);
QGraphicsPixmapItem *tileItem;
void update(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
protected:
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
};

CPP:

.Constructor etc
.
.

void Tile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
if(tileItem==NULL)
{
qDebug()<<"Loading Pixmap";
QPixmap p("c:\\qt\\tile\\tile0-0.png");
tileItem=new QGraphicsPixmapItem;
tileItem->setPixmap(p);
}
tileItem->paint(painter,option,widget);
}

我正在尝试制作一个将大图像的图 block 粘贴到 QGraphicsScene 上的应用程序。但是一次加载所有图 block 非常耗时并且占用大量内存。所以我继承了 QGraphicsItem 并重写了 paint。 QGraphicsItem 类中的 paint 方法只有在 QGraphicsView 中出现时才会被调用。因此,通过在绘画中加载我的图 block ,我基本上可以创建一个仅在图 block 出现时才加载图 block 的应用程序。到目前为止,这一切都在起作用。

为了改善用户体验,我使用 QtConcurrent 尝试在单独的线程中加载磁贴。所以这是我所做的更改。

CPP

connect(&watcher,SIGNAL(finished()),this,SLOT(updateSceneSlot()));

void Tile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
if(tileItem==NULL)
{
TilePainter=painter;
TileOption=option;
TileWidget=widget;
qDebug()<<"Paint Thread id "<< QThread::currentThread();

future=QtConcurrent::run(LoadTilePixmap,this);
watcher.setFuture(future);
}
else
tileItem->paint(painter, option, widget);

}

LoadTilePixmap 函数:

void LoadTilePixmap(Tile *temp,QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
qDebug()<<"Loading Pixmap";
QPixmap p("c:\\qt\\tile\\tile0-0.png");
temp->tileItem=new QGraphicsPixmapItem;
temp->tileItem->setPixmap(p);
qDebug()<<"Loaded Pixmap";
}


void Tile::updateSceneSlot()
{
qDebug()<<"updateSceneSlot Thread id "<< QThread::currentThread();
tileItem->paint(TilePainter, TileOption, TileWidget);
}

这段代码应该可以工作,但是一旦调用 paint,它就会在运行时崩溃。添加断点后,我将问题缩小到导致崩溃的 temp->tileItem->paint(painter,option,widget);

我得到的输出是

Loading Pixmap 
Almost Loaded Pixmap
First-chance exception at 0x6526174a (QtGuid4.dll) in Visualizer.exe: 0xC0000005: Access violation reading location 0xc88bffe1.
Unhandled exception at 0x6526174a (QtGuid4.dll) in Visualizer.exe: 0xC0000005: Access violation reading location 0xc88bffe1.

谁能帮我告诉我 laSTLine/paint 方法崩溃的原因。我该如何解决?

编辑代码以更新更改

最佳答案

只有主(也称为 GUI)线程可以在屏幕上绘制。LoadTilePixmap() 函数中的以下行,您在单独的线程中运行,我相信,尝试在屏幕上绘制您的像素图项目的内容。

temp->tileItem->paint(painter,option,widget);

在线程中,您应该只加载和准备图像,当线程完成时,向主线程发出图像已准备就绪的信号,并从主线程进行绘图。

关于c++ - 使用 QtConcurrent 加载 Pixmap 并绘制它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951072/

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