QGraphicsScene 上的静态 QGraphicsItem

Posted

技术标签:

【中文标题】QGraphicsScene 上的静态 QGraphicsItem【英文标题】:Static QGraphicsItem on QGraphicsScene 【发布时间】:2015-04-24 15:33:42 【问题描述】:

我正在使用图形视图框架在 Qt 中开发一个简单的 Pacman 克隆游戏。我创建了一个类,WallItem,它继承了 QGraphicsItem。它代表迷宫,由许多小块(弧线、直线等)组成。

class WallItem: public QGraphicsItem

protected:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

我的应用程序的主类继承了 QGraphicsView。

class Canvas:  public QGraphicsView 

    Q_OBJECT
private:
    WallItem* wallItem;
    PacmanItem* pacman;
    //other items

在 Canvas 的构造函数中,我将 wallItem 添加到场景中;

wallItem = new WallItem(/*params*/);
scene()->addItem(wallItem);
pacmanItem = new PacmanItem(/*params*/);
scene()->addItem(pacmanItem);
//other items

问题是我只想调用一次wallItem 的方法paint - 在应用程序开始时,因为迷宫中的墙壁是静态的。但是,当 pacman 移动或食物被移除时,场景更新和所有项目(包括 wallItem)都会重新绘制,从而影响性能。我怎样才能使我的wallItem 静态,而不需要在场景中的每次更新时重新绘制?

对不起,我的英语不是我的母语。

【问题讨论】:

也许 QGraphicsItem::ItemCoordinateCache 是你需要的 【参考方案1】:

enum QGraphicsItem::CacheMode

"缓存用于通过分配和渲染到屏幕外像素缓冲区来加速渲染,当项目需要重绘时可以重复使用该缓冲区。对于某些绘图设备,缓存直接存储在图形内存中,这使得渲染很快。”

试试

QGraphicsItem::ItemCoordinateCache

【讨论】:

完美运行!谢谢你,塔利亚!

以上是关于QGraphicsScene 上的静态 QGraphicsItem的主要内容,如果未能解决你的问题,请参考以下文章

从 QGraphicsScene 上的 QGraphicsLinearLayout 中删除 QGraphics 项

QGraphicsScene 的奇怪问题

当图形项目靠在其边框上时,使 QGraphicsScene 更大

在 QGraphicsView/QGraphicsScene 中移动 QGraphicsProxyWidget 中的嵌入式小部件

Qt 获取QGraphicsItem在屏幕上的位置,在QGraphicsItem中获取全局位置,转换为screenPos

使用 QGraphicsScene::addItem 将 QPixmap 项目添加到 QGraphicsScene 会导致 PySide 崩溃