簡體   English   中英

Qt:重疊的半透明QgraphicsItem

[英]Qt: Overlapping semitransparent QgraphicsItem

我一直在使用QGraphicsView一段時間,我面臨一個必要條件,我不確定它是否可以通過使用此框架來實現。

盡量簡單,我有2個重疊的RectItem和一個半透明的QBrush(兩者都是相同的)。 是否有可能防止重疊區域變得更不透明? 我只是希望整個區域具有相同的顏色(只有當兩個區域完全不透明時才會出現,但有時情況並非如此)

我知道這似乎是一個奇怪的必要條件,但我的同事使用的舊圖形引擎允許它。

有任何想法嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM