Qt的:重叠半透明的QGraphicsItem(Qt: Overlapping semitransp

2019-10-23 20:36发布

我一直使用的QGraphicsView了一段时间,我面对,我不知道这是否可以用这个框架来实现的必要条件。

把它尽可能简单,我有2与半透明QBrush(同一个用于两者)重叠RectItem。 是否有可能避免重叠区域变得更不透明? 我只是想整个区域具有相同的颜色(如果两个rects是完全不透明的,这只会发生,但有时事实并非如此)

我知道这可能看起来怪异必要的,但旧的图形引擎,我的同事们使用使得它。

有任何想法吗?

Answer 1:

Qt提供的各种共混物(组合物)模式的QPainter 。 从推导或的QGraphicsItem您QGraphicsObject类RectItem,允许您自定义的绘画和使用的组成模式 ,创造各种效果,如示Qt的例子 。

如果你希望两个半透明的项目,而不改变颜色重叠(假设它们的颜色是一样的),无论是的QPainter :: CompositionMode_Difference模式 ,或将CompositionMode_Exclusion做到这一点。 下面是这种对象的示例代码: -

#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

履行

#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);


文章来源: Qt: Overlapping semitransparent QgraphicsItem