[英]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.