Qt:重叠半透明QgraphicsItem
Qt: Overlapping semitransparent QgraphicsItem
我使用 QGraphicsView 已经有一段时间了,我面临一个要求,我不确定使用这个框架是否可以满足它。
尽可能简单地说,我有 2 个重叠的 RectItem 和一个半透明的 QBrush(两者相同)。是否可以防止重叠区域变得更加不透明?我只希望整个区域具有相同的颜色(只有当两个矩形都完全不透明时才会出现这种情况,但有时情况并非如此)
我知道这可能看起来很奇怪,但我的同事使用的旧图形引擎允许它。
有什么想法吗?
Qt 为 QPainter. Deriving your RectItem class from QGraphicsItem or QGraphicsObject, allows you to customise the painting and using the composition modes, create various effects, as demonstrated in the 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);
我使用 QGraphicsView 已经有一段时间了,我面临一个要求,我不确定使用这个框架是否可以满足它。
尽可能简单地说,我有 2 个重叠的 RectItem 和一个半透明的 QBrush(两者相同)。是否可以防止重叠区域变得更加不透明?我只希望整个区域具有相同的颜色(只有当两个矩形都完全不透明时才会出现这种情况,但有时情况并非如此)
我知道这可能看起来很奇怪,但我的同事使用的旧图形引擎允许它。
有什么想法吗?
Qt 为 QPainter. Deriving your RectItem class from QGraphicsItem or QGraphicsObject, allows you to customise the painting and using the composition modes, create various effects, as demonstrated in the 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);