c++ - Qt:重叠半透明QgraphicsItem

标签 c++ qt qgraphicsview

我使用 QGraphicsView 已经有一段时间了,我面临一个要求,我不确定使用这个框架是否可以满足它。

尽可能简单地说,我有 2 个重叠的 RectItem 和一个半透明的 QBrush(两者相同)。是否可以防止重叠区域变得更加不透明?我只希望整个区域具有相同的颜色(只有当两个矩形都完全不透明时才会发生这种情况,但有时情况并非如此)

我知道这可能看起来很奇怪,但我的同事使用的旧图形引擎允许这样做。

有什么想法吗?

最佳答案

Qt 为 QPainter 提供了多种混合(合成)模式.从 QGraphicsItem 或 QGraphicsObject 派生 RectItem 类,允许您自定义绘画并使用 composition modes , 创建各种效果,如 Qt Example 中所示.

如果您希望两个半透明项目重叠而不改变颜色(假设它们的颜色相同),QPainter::CompositionMode_Difference mode , 或 CompositionMode_Exclusion 将执行此操作。这是此类对象的示例代码:-

Header

#ifndef RECTITEM_H
#define RECTITEM_H

#include <QGraphicsItem>
#include <QColor>

class RectItem : public QGraphicsItem
{
public:
    RectItem(int width, int height, QColor colour);
    ~RectItem();

    QRectF boundingRect() const;

private:
    QRectF m_boundingRect;
    QColor m_colour;

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
};

#endif // RECTITEM_H

Implementation

#include "rectitem.h"
#include <QPainter>

RectItem::RectItem(int width, int height, QColor colour)
    : QGraphicsItem(), m_boundingRect(-width/2, -height/2, width, height), m_colour(colour)
{    
    setFlag(QGraphicsItem::ItemIsSelectable);
    setFlag(QGraphicsItem::ItemIsMovable);
}

RectItem::~RectItem()
{
}

QRectF RectItem::boundingRect() const
{
    return m_boundingRect;
}

void RectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
    painter->setCompositionMode(QPainter::CompositionMode_Difference);
    painter->setBrush(m_colour);
    painter->drawRect(m_boundingRect);
}

您现在可以创建两个具有相同半透明颜色的 RectItem 对象并将它们添加到场景中

// assuming the scene and view are setup and m_pScene is a pointer to the scene

RectItem* pItem = new RectItem(50, 50, QColor(255, 0, 0, 128));
pItem->setPos(10, 10);
m_pScene->addItem(pItem);

pItem = new RectItem(50, 50, QColor(255, 0, 0, 128));
pItem->setPos(80, 80);
m_pScene->addItem(pItem);

关于c++ - Qt:重叠半透明QgraphicsItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31403383/

相关文章:

c++ - 如何在 C++ 中存储数据并使数据可搜索?

c++ - OMNET++ 5.0 和 Qt

qt - 如何使用 QGraphicsView 的 translate() 函数?

c++ - 无法初始化静态常量字符串

c++ - 什么是基于 >MACHINE< 的好 PPC 用于为顺序处理器分析代码

c++ - 无论存储类型如何,是否允许访问 union 成员的公共(public)基类?

c++ - Qthread多线程意外结果

c++ - 如何像在 Visual Studio 中一样在 Qt Creator 中构建 dll?

python - QGraphicsGridLayout 适用于 PySide 但不适用于 PyQt4

c++ - QGraphicsItem 不接收鼠标悬停事件