我正在尝试创建一个 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);
};
共产党:
.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);
}
我正在尝试制作一个将大图像的图块粘贴到 QGraphicsScene 上的应用程序。但是一次加载所有图块非常耗时并且占用大量内存。所以我继承了 QGraphicsItem 并覆盖了paint。QGraphicsItem 类中的paint 方法仅在它进入QGraphicsView 内部时被调用。因此,通过在绘画中加载我的图块,我基本上可以创建一个仅在图块出现时才加载图块的应用程序。到目前为止,这很有效。
为了让用户体验更好,我使用 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 方法会崩溃。我该如何解决?
编辑代码以更新更改