QT之QGraphicsPixmapItem详细介绍

此篇文章来源于自己在完成一个图片编辑软件而遇到的三个类:QGraphicsScene、QGraphicsPixmapItem、QGraphicsView。此篇文章先介绍QGraphicsPixmapItem,另外两个类在其他文章,大家可查看博主其他文章。本人能力有限,大家有任何问题可评论区评论,共同学习,共同进步。

一、QGraphicsPixmapItem介绍

QGraphicsPixmapItem 是 Qt 框架中的一个类,它是 QGraphicsItem 类的一个派生类,专为在 QGraphicsScene 中显示和操作像素图(即 QPixmap 对象)而设计。它主要用于在图形视图体系结构(Graphics View Framework)中呈现静态或动态的图像资源。

主要特性及用途

  1. 显示图像

    • 可以通过构造函数传递一个 QPixmap 对象创建 QGraphicsPixmapItem 实例,并将其添加到 QGraphicsScene 中显示图像。
    • 也可以在对象创建后使用 setPixmap(const QPixmap &) 方法动态改变显示的图像。
  2. 变换与定位

    • 可以对 QGraphicsPixmapItem 进行平移、旋转和缩放等几何变换。
    • 使用 setPos()setRotation()setScale() 等方法来调整其在场景中的位置、旋转角度和缩放比例。
  3. 形状与掩模

    • 通过 setShapeMode() 函数设置形状模式,比如 QGraphicsPixmapItem::MaskShape,这样可以利用 QPixmap 的掩模信息定义项目本身的形状和透明度。
  4. 碰撞检测与交互

    • 默认情况下,碰撞检测基于整个像素图的边界,但也支持自定义形状,以便更精确地响应用户交互和场景中的其他图形项。
    • 可以处理鼠标事件,如点击、移动等,从而实现拖动、选择等功能。
  5. 透明度支持

    • 可以设置 QGraphicsPixmapItem 的不透明度,使得所显示的图像具有透明效果。
  6. 层次关系

    • 在图形视图中,QGraphicsPixmapItem 可以和其他图形项一样,参与场景的层次管理,可以通过 setZValue() 方法调整其在垂直方向上的叠放顺序。

总之,QGraphicsPixmapItem 是在图形视图框架中处理图像显示的核心组件,广泛应用于各种桌面应用程序的图形化界面构建,尤其在需要动态显示和操作图像的场合下非常有用。

关于QGraphicsItem 之后在其他文章进行介绍

二、成员函数

1、QGraphicsPixmapItem::QGraphicsPixmapItem(const QPixmap &pixmapQGraphicsItem *parent = nullptr)

QGraphicsPixmapItem::QGraphicsPixmapItem(const QPixmap &pixmap, QGraphicsItem *parent = nullptr) 是 QGraphicsPixmapItem 类的一个构造函数。这个构造函数用于创建一个新的 QGraphicsPixmapItem 对象,并初始化它来显示给定的 QPixmap 图像。

参数说明:

  • const QPixmap &pixmap:一个 QPixmap 对象引用,它包含了要在 QGraphicsPixmapItem 中显示的图像数据。
  • QGraphicsItem *parent = nullptr:一个指向 QGraphicsItem 类型的指针,表示新建的 QGraphicsPixmapItem 的父项。如果提供了父项,那么新创建的 QGraphicsPixmapItem 将成为该父项的孩子节点,并遵循图形视图中的父子关系规则,如布局、变换和事件处理等。如果未提供父项,则该图形项将成为场景的顶层项。

示例代码:

// 创建一个 QPixmap 对象
QPixmap pixmap("image.jpg");

// 使用构造函数创建一个 QGraphicsPixmapItem 对象,并设置其显示的图像
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(pixmap);

// 将该图形项添加到 QGraphicsScene 中
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);

// 将 QGraphicsScene 显示在 QGraphicsView 中
QGraphicsView *view = new QGraphicsView(scene);
view->show();

在这段代码中,我们首先创建了一个 QPixmap 对象,然后使用 QGraphicsPixmapItem 构造函数创建了一个新的图形项,并将其关联到先前创建的 QPixmap 对象上。随后,我们将这个图形项添加到场景中,并通过 QGraphicsView 显示出来。

2、QGraphicsPixmapItem::QGraphicsPixmapItem(QGraphicsItem *parent = nullptr)

QGraphicsPixmapItem::QGraphicsPixmapItem(QGraphicsItem *parent = nullptr) 是 QGraphicsPixmapItem 类的另一个构造函数,用于创建一个新的 QGraphicsPixmapItem 对象,但不立即为其分配任何图像(QPixmap)。

参数说明:

  • QGraphicsItem *parent = nullptr:一个指向 QGraphicsItem 类型的指针,表示新建的 QGraphicsPixmapItem 的父项。如果提供了父项,那么新创建的 QGraphicsPixmapItem 将成为该父项的孩子节点,并遵循图形视图中的父子关系规则,如布局、变换和事件处理等。如果未提供父项,则该图形项将成为场景的顶层项。

使用这个构造函数创建的 QGraphicsPixmapItem 初始时并没有显示任何图像,需要通过调用 setPixmap(const QPixmap &) 方法来设置显示的图像。

示例代码:

// 使用无参构造函数创建一个 QGraphicsPixmapItem 对象
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(nullptr);

// 加载一个 QPixmap 图像
QPixmap pixmap("image.jpg");

// 为已创建的 QGraphicsPixmapItem 设置图像
pixmapItem->setPixmap(pixmap);

// 将该图形项添加到 QGraphicsScene 中
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);

// 将 QGraphicsScene 显示在 QGraphicsView 中
QGraphicsView *view = new QGraphicsView(scene);
view->show();

这段代码首先使用无参构造函数创建了一个空的 QGraphicsPixmapItem,然后加载了一个 QPixmap 图像,并通过 setPixmap() 方法将图像设置到该图形项上。后续步骤同上,将图形项添加到场景并通过视图显示。

3、QGraphicsPixmapItem::~QGraphicsPixmapItem()

QGraphicsPixmapItem::~QGraphicsPixmapItem() 是 QGraphicsPixmapItem 类的析构函数。在C++中,析构函数是一种特殊的成员函数,当 QGraphicsPixmapItem 类的对象生命周期结束时(例如,当对象离开其作用域或者被显式删除时),系统会自动调用这个函数。

析构函数的主要任务是清理对象占用的资源,对于 QGraphicsPixmapItem 类来说,析构过程中通常会释放与该对象关联的资源,例如清除加载的 QPixmap 图像(如果存在的话),以及释放其他占用的内存等。

然而,Qt框架中的 QPixmap 和 QGraphicsPixmapItem 类通常依赖于智能指针和引用计数机制来管理内存,因此在 QGraphicsPixmapItem 析构时,如果其持有的 QPixmap 对象没有其他引用,Qt框架会自动处理其释放。在手动编写析构函数时,通常不需要特别关注这一点,除非你在自定义的 QGraphicsPixmapItem 子类中有额外需要清理的资源。

4、QRectF QGraphicsPixmapItem::boundingRect() const

QRectF QGraphicsPixmapItem::boundingRect() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个 QRectF 对象,表示该图形项(即包含的 QPixmap 图像)的边界矩形。

在Qt的图形视图框架中,每个 QGraphicsItem 都有一个边界矩形,用于碰撞检测、命中测试以及确定绘画区域等目的。对于 QGraphicsPixmapItem,它的边界矩形默认是其所包含的 QPixmap 对象的实际大小(考虑了缩放和旋转的影响)。

返回值:

  • QRectF 类型的对象,表示 QGraphicsPixmapItem 的边界矩形。

示例代码:

QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap("image.png"));
QRectF bounds = pixmapItem->boundingRect();
qDebug() << "Bounding Rect of the item: " << bounds;

上述代码创建了一个 QGraphicsPixmapItem 对象,并从该对象获取其边界矩形。这个矩形会反映出 QPixmap 的实际显示尺寸,即使该图像已经被缩放或旋转。

5、bool QGraphicsPixmapItem::contains(const QPointF &point) const

bool QGraphicsPixmapItem::contains(const QPointF &point) const 是 QGraphicsPixmapItem 类的一个成员函数,用于判断给定点是否位于该图形项(即 QPixmap 图像)的边界内。

该函数接收一个 QPointF 类型的参数 point,该点通常是以场景坐标系表示的一个二维点。函数会检查这个点是否落在当前 QGraphicsPixmapItem 对象的边界矩形之内,如果在,则返回 true;否则返回 false

使用此函数可以帮助开发者进行交互检测,例如检测鼠标点击事件是否发生在某个图像项目上。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
QPointF mousePoint; // 假设这是获取到的鼠标点击场景中的位置
if (item->contains(mousePoint)) {
    qDebug() << "The mouse click is within the bounds of the pixmap item.";
} else {
    qDebug() << "The mouse click is outside the bounds of the pixmap item.";
}

请注意,在判断点是否在图像内部时,contains() 函数只检查边界矩形而不考虑图像的透明度。如果需要检查点是否在图像的非透明像素上,可能需要实现更复杂的逻辑。

6、bool QGraphicsPixmapItem::isObscuredBy(const QGraphicsItem *item) const

bool QGraphicsPixmapItem::isObscuredBy(const QGraphicsItem *item) const 是 QGraphicsPixmapItem 类的一个成员函数,用于判断当前 QGraphicsPixmapItem 是否被另一个 QGraphicsItem 完全遮挡(即当前图形项的任何部分都没有可见)。

函数参数:

  • const QGraphicsItem *item:是指向另一个 QGraphicsItem 的指针,用于检查是否遮挡了当前 QGraphicsPixmapItem

返回值:

  • 如果当前 QGraphicsPixmapItem 完全被 item 遮挡,则返回 true
  • 如果不是,则返回 false

示例代码:

QGraphicsPixmapItem *pixmapItem1 = new QGraphicsPixmapItem(QPixmap("image1.png"));
QGraphicsPixmapItem *pixmapItem2 = new QGraphicsPixmapItem(QPixmap("image2.png"));

// 假设两个图形项已经在同一个 QGraphicsScene 中,并且有可能重叠
if (pixmapItem1->isObscuredBy(pixmapItem2)) {
    qDebug() << "pixmapItem1 is completely obscured by pixmapItem2";
} else {
    qDebug() << "pixmapItem1 is not completely obscured by pixmapItem2";
}

这个函数对于在图形视图中进行层叠和混合的项目很有用,可以帮助你判断哪个项目位于前面,或者哪个项目被隐藏在其他项目之下。

7、QPointF QGraphicsPixmapItem::offset() const

QPointF QGraphicsPixmapItem::offset() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个 QPointF 类型的对象,表示当前 QGraphicsPixmapItem 中的 QPixmap 图像相对于其本地坐标原点的偏移量。

在 QGraphicsPixmapItem 中,offset() 函数会影响到图像在项目坐标系统中的显示位置,但不会改变图像的实际大小或边界矩形。这意味着即使设置了偏移量,图像的边界仍然基于其原始大小和位置,但图像内容会根据偏移量进行移动。

示例代码:

QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap("image.png"));
QPointF originalOffset = pixmapItem->offset(); // 获取初始偏移量
// 如果需要修改偏移量
pixmapItem->setOffset(QPointF(10, 10)); // 将图像向右和向下各偏移10个单位
QPointF newOffset = pixmapItem->offset(); // 获取修改后的偏移量

通过 offset() 和 setOffset() 函数,可以灵活地控制图像在显示时的位置,而无需直接改变 QGraphicsPixmapItem 的位置属性。

8、QPainterPath QGraphicsPixmapItem::opaqueArea() const

QPainterPath QGraphicsPixmapItem::opaqueArea() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个 QPainterPath 对象,表示当前 QGraphicsPixmapItem 中不透明区域的形状路径。

在图形视图框架中,特别是对于包含透明区域的图像而言,了解哪些部分是不透明的非常重要,因为它可以帮助优化绘图效率和碰撞检测。opaqueArea() 函数返回的 QPainterPath 描述了 QPixmap 中所有非透明像素的轮廓形状。

需要注意的是,Qt 不会自动为每个 QGraphicsPixmapItem 计算不透明区域,除非调用了 QGraphicsPixmapItem::setShapeMode(QGraphicsPixmapItem::MaskShape) 来指定使用掩模形状。在这种情况下,opaqueArea() 函数将返回一个与图像不透明区域匹配的路径。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setShapeMode(QGraphicsPixmapItem::MaskShape); // 必须设置掩模形状模式

QPainterPath opaqueArea = item->opaqueArea();

在上面的代码中,如果 image.png 包含透明区域,那么 opaqueArea 将会表示该图像中不透明区域的形状。

9、void QGraphicsPixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *optionQWidget *widget)

void QGraphicsPixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 是 QGraphicsPixmapItem 类的一个重载虚函数,它是 Qt 的图形视图框架(QGraphicsView)中的一个方法,用于在给定的 QPainter 上绘制 QGraphicsPixmapItem

当 QGraphicsScene 需要重绘其内容时,此函数会被调用。以下是该函数各个参数的解释:

  • *QPainter painter: 这是一个指向 QPainter 对象的指针,QPainter 提供了在各种设备上进行二维图形绘制的功能。在这里,painter 用于在 QGraphicsPixmapItem 上绘制图像。

  • *const QStyleOptionGraphicsItem option: 这是一个指向 QStyleOptionGraphicsItem 结构体的常量指针,包含了样式选项和其他影响图形项绘制的信息,比如状态(选中、禁用等)、视图变换等。

  • *QWidget widget: 这是一个指向关联 QWidget 的指针,尽管在大多数情况下,对于 QGraphicsPixmapItem 绘制操作而言,这个参数可能不是必需的,但在某些涉及样式表或需要知道父窗口上下文的情况下,可能会用到。

在自定义 QGraphicsPixmapItem 的绘制行为时,您可以通过覆盖 paint() 函数来实现特殊的效果,例如在显示图像的基础上添加额外的绘制元素或其他视觉效果。不过,通常情况下,对于简单地显示一个 pixmap 图像来说,无需重写 paint() 函数,因为默认的实现就已经足够用来展示加载的图像了。如果您确实需要修改绘制行为,可以这样做:

class CustomPixmapItem : public QGraphicsPixmapItem {
public:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        // 先执行默认的绘制行为
        QGraphicsPixmapItem::paint(painter, option, widget);

        // 添加自定义的绘制代码
        // ...
    }
};

10、QPixmap QGraphicsPixmapItem::pixmap() const

QPixmap QGraphicsPixmapItem::pixmap() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回与该图形项关联的 QPixmap 对象。QPixmap 是 Qt 中用于存储和处理位图图像的数据结构,它可以被用于显示静态图像或者作为绘制操作的目标。

当你创建或设置了 QGraphicsPixmapItem 对象的 QPixmap 后,通过调用 pixmap() 函数,你可以获取当前关联到该图形项上的像素图。这个函数是 const 成员函数,这意味着它不会改变 QGraphicsPixmapItem 的内部状态。

示例使用:

// 假设我们有一个 QGraphicsPixmapItem 实例 named pItem,并且已经设置了一个 QPixmap
QPixmap originalPixmap("path/to/image.png");
pItem->setPixmap(originalPixmap);

// 获取并使用 pItem 关联的 QPixmap
QPixmap itemPixmap = pItem->pixmap();
// 现在你可以用 itemPixmap 进行其他操作,如缩放、显示在 QLabel 等

11、void QGraphicsPixmapItem::setOffset(const QPointF &offset)

void QGraphicsPixmapItem::setOffset(const QPointF &offset) 是 QGraphicsPixmapItem 类中的一个成员函数,它是 Qt GUI 库的一部分,用于设置图形像素图项目(QGraphicsPixmapItem)在其父坐标系中的偏移量。

当调用此函数时,传入的是一个 QPointF 类型的对象,代表二维向量,其包含 x 和 y 分量,分别对应水平和垂直方向上的偏移值。设置偏移后,QGraphicsPixmapItem 中的 pixmap(像素图)将在原位置基础上加上指定的偏移量进行显示。

例如:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setOffset(QPointF(10.0, 20.0));

在这个例子中,像素图将会在其默认放置位置上向右偏移 10 个单位,向下偏移 20 个单位来显示。这对于调整图形项在场景中的精确布局非常有用。

12、void QGraphicsPixmapItem::setOffset(qreal xqreal y)

void QGraphicsPixmapItem::setOffset(qreal x, qreal y) 是 QGraphicsPixmapItem 类的一个成员函数,它用于设置图形像素图项目(QGraphicsPixmapItem)在其父坐标系中的偏移量。这个函数接受两个浮点数参数 x 和 y,分别代表在水平和垂直方向上的偏移值。

当调用此函数时,传入的 x 和 y 参数将导致该像素图项目的内容在其原本的位置基础上按指定的偏移量进行显示。这种方式有助于精细调整图形项在场景中的位置,尤其是在图形项本身包含透明区域或者需要与其它图形项精确对齐时。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setOffset(10.0, 20.0); // 将像素图在其原始位置基础上向右偏移10个单位,向下偏移20个单位

在这个例子中,像素图“image.png”将会被放置在比原始位置右移10像素,下移20像素的新位置上。

13、void QGraphicsPixmapItem::setPixmap(const QPixmap &pixmap)

void QGraphicsPixmapItem::setPixmap(const QPixmap &pixmap) 是 QGraphicsPixmapItem 类的一个成员函数,它用于设置 QGraphicsPixmapItem 显示的像素图(QPixmap)。这个函数接收一个 QPixmap 对象作为参数,将此对象的内容替换当前 QGraphicsPixmapItem 中显示的图像。

示例代码:

// 创建一个 QGraphicsPixmapItem 对象
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem();

// 创建一个 QPixmap 对象,加载一张图片
QPixmap pixmap("image.jpg");

// 将 QPixmap 设置到 QGraphicsPixmapItem 中显示
pixmapItem->setPixmap(pixmap);

// 将此图形项添加到 QGraphicsScene 中,并通过 QGraphicsView 显示
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);
QGraphicsView *view = new QGraphicsView(scene);
view->show();

在这个例子中,我们首先创建了一个 QGraphicsPixmapItem 对象,接着创建了一个加载了图片文件 "image.jpg" 的 QPixmap 对象。然后,通过调用 setPixmap() 函数,将这个像素图设置到图形项上,最后将图形项添加到场景并显示在视图中。

14、void QGraphicsPixmapItem::setShapeMode(QGraphicsPixmapItem::ShapeMode mode)

void QGraphicsPixmapItem::setShapeMode(QGraphicsPixmapItem::ShapeMode mode) 是 QGraphicsPixmapItem 类的一个成员函数,用于设置图形像素图项目的形状模式。这个函数决定了 QGraphicsPixmapItem 在碰撞检测、命中测试以及其他与形状相关的操作中如何表现。

QGraphicsPixmapItem::ShapeMode 是一个枚举类型,包含以下几个可选值:

  1. QGraphicsPixmapItem::MaskShape:使用 QPixmap 的 Alpha 通道(透明度)作为形状。这意味着只有非透明区域才会参与碰撞检测和命中测试。

  2. QGraphicsPixmapItem::BoundingRectShape(默认值):使用 QGraphicsPixmapItem 的边界矩形作为形状。这意味着无论 QPixmap 是否包含透明区域,碰撞检测和命中测试都会基于整个边界矩形进行。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setShapeMode(QGraphicsPixmapItem::MaskShape);

在这个例子中,我们创建了一个 QGraphicsPixmapItem 对象,并设置了它的形状模式为 MaskShape。这意味着该图形项的碰撞检测和命中测试只会考虑其 QPixmap 中非透明的部分。

15、void QGraphicsPixmapItem::setTransformationMode(Qt::TransformationMode mode)

void QGraphicsPixmapItem::setTransformationMode(Qt::TransformationMode mode) 是 QGraphicsPixmapItem 类的一个成员函数,用于设置图像(QPixmap)在显示和渲染时的变换模式。这个变换模式决定了当 QGraphicsPixmapItem 进行缩放、旋转等几何变换时,图像的颜色和形状应该如何处理。

Qt::TransformationMode 是一个枚举类型,包含以下几个常见的变换模式:

  • Qt::FastTransformation:快速变换模式,可能会牺牲图像质量以提高性能,尤其是对于非整数缩放因子时,可能会出现锯齿或颜色失真。
  • Qt::SmoothTransformation:平滑变换模式,尝试在缩放过程中保持图像的质量,采用抗锯齿技术来减少边缘的锯齿现象,但代价是可能降低渲染速度。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setTransformationMode(Qt::SmoothTransformation);

在这个例子中,我们创建了一个 QGraphicsPixmapItem 对象,并设置了它的变换模式为 Qt::SmoothTransformation。这意味着当该图像项进行缩放或其他几何变换时,Qt将尽量保持图像的平滑性和质量,防止出现明显的锯齿效应。

16、QPainterPath QGraphicsPixmapItem::shape() const

QPainterPath QGraphicsPixmapItem::shape() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个 QPainterPath 对象,表示该图形像素图项目的形状。这个形状用于碰撞检测、命中测试以及其他与图形形状相关的操作。

QPainterPath 是 Qt 中用于描述矢量图形路径的类,它可以表示闭合或开放的曲线、直线段等图形元素的集合。

对于 QGraphicsPixmapItem,其形状取决于设置的 ShapeMode

  • 如果 ShapeMode 为 QGraphicsPixmapItem::BoundingRectShape(默认),则 shape() 返回的是该像素图项的边界矩形。
  • 如果 ShapeMode 为 QGraphicsPixmapItem::MaskShape,则 shape() 返回的是该像素图的不透明区域的形状。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setShapeMode(QGraphicsPixmapItem::MaskShape);
QPainterPath shapePath = item->shape();

在这个例子中,我们创建了一个 QGraphicsPixmapItem 对象,并设置了它的形状模式为 MaskShape。之后调用 shape() 函数获取该图形项的形状,此时得到的 shapePath 将表示 QPixmap 中非透明区域的轮廓路径。

17、QGraphicsPixmapItem::ShapeMode QGraphicsPixmapItem::shapeMode() const

QGraphicsPixmapItem::ShapeMode QGraphicsPixmapItem::shapeMode() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个枚举值 QGraphicsPixmapItem::ShapeMode,表示当前图形像素图项目(QGraphicsPixmapItem)的形状模式。

QGraphicsPixmapItem::ShapeMode 是一个枚举类型,有两个可能的取值:

  1. QGraphicsPixmapItem::BoundingRectShape(默认值):在这种模式下,QGraphicsPixmapItem 的形状被视为其边界矩形,这意味着碰撞检测和命中测试会基于整个矩形区域进行,而不管其中的像素图(QPixmap)是否有透明区域。

  2. QGraphicsPixmapItem::MaskShape:在这种模式下,QGraphicsPixmapItem 的形状由其关联的像素图的 alpha 通道决定,即仅将不透明区域视为有效形状。这样,在进行碰撞检测和命中测试时,透明区域将被视为不可见,不会参与这些操作。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
item->setShapeMode(QGraphicsPixmapItem::MaskShape);

// 获取当前的形状模式
QGraphicsPixmapItem::ShapeMode currentShapeMode = item->shapeMode();
if (currentShapeMode == QGraphicsPixmapItem::MaskShape) {
    qDebug() << "The shape mode is MaskShape.";
} else {
    qDebug() << "The shape mode is BoundingRectShape (default).";
}

这段代码首先创建了一个 QGraphicsPixmapItem 对象,并将其形状模式设置为 MaskShape,然后通过调用 shapeMode() 函数获取并输出当前的形状模式。

18、Qt::TransformationMode QGraphicsPixmapItem::transformationMode() const

Qt::TransformationMode QGraphicsPixmapItem::transformationMode() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个 Qt::TransformationMode 类型的枚举值,表示当前图形像素图项目(QGraphicsPixmapItem)在进行缩放、旋转等几何变换时使用的变换模式。

Qt::TransformationMode 是一个枚举类型,常用的两个值包括:

  1. Qt::FastTransformation:快速变换模式,适用于性能敏感的情况,但它可能导致图像在缩放时出现锯齿或者颜色失真,特别是在非整数缩放因子时。

  2. Qt::SmoothTransformation:平滑变换模式,保证图像在缩放时具有更好的视觉效果,通过抗锯齿技术来减少边缘的锯齿感,但可能会牺牲一定的性能。

示例代码:

QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap("image.png"));
// 假设之前已经设置了某种变换模式
// ...

// 获取当前的变换模式
Qt::TransformationMode currentMode = item->transformationMode();

if (currentMode == Qt::FastTransformation) {
    qDebug() << "The transformation mode is FastTransformation.";
} else if (currentMode == Qt::SmoothTransformation) {
    qDebug() << "The transformation mode is SmoothTransformation.";
}

这段代码首先创建了一个 QGraphicsPixmapItem 对象,并假设之前已经设置了某种变换模式,然后通过调用 transformationMode() 函数获取并输出当前的变换模式。

19、int QGraphicsPixmapItem::type() const

int QGraphicsPixmapItem::type() const 是 QGraphicsPixmapItem 类的一个成员函数,它返回一个整数值,表示该类在 QGraphicsItem 的层次结构中的类型标识符。在 Qt 的图形视图框架中,每个派生自 QGraphicsItem 的类都应该重写 type() 函数,以返回一个唯一的整数值。

这个唯一标识符主要用于识别不同的 QGraphicsItem 子类,特别是在使用 qgraphicsitem_cast 或 dynamic_cast 进行类型转换时。type() 函数的返回值通常是 Q_DECLARE_TYPEINFO 宏定义的类型 ID。

对于 QGraphicsPixmapItem,其 type() 函数的返回值是在 qgraphicsitem.h 文件中预定义的,确保与其他图形项类的类型标识符互不冲突。

示例代码:

QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap("image.png"));
int itemType = pixmapItem->type();

在此代码片段中,我们创建了一个 QGraphicsPixmapItem 对象,并调用 type() 函数获取它的类型标识符。虽然在实际应用中,我们很少直接使用这个标识符的数值,但它在图形视图框架内部的类型识别和转换中起着关键作用。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值