我一直使用的QGraphicsView了一段时间,我面对,我不知道这是否可以用这个框架来实现的必要条件。
把它尽可能简单,我有2与半透明QBrush(同一个用于两者)重叠RectItem。 是否有可能避免重叠区域变得更不透明? 我只是想整个区域具有相同的颜色(如果两个rects是完全不透明的,这只会发生,但有时事实并非如此)
我知道这可能看起来怪异必要的,但旧的图形引擎,我的同事们使用使得它。
有任何想法吗?
我一直使用的QGraphicsView了一段时间,我面对,我不知道这是否可以用这个框架来实现的必要条件。
把它尽可能简单,我有2与半透明QBrush(同一个用于两者)重叠RectItem。 是否有可能避免重叠区域变得更不透明? 我只是想整个区域具有相同的颜色(如果两个rects是完全不透明的,这只会发生,但有时事实并非如此)
我知道这可能看起来怪异必要的,但旧的图形引擎,我的同事们使用使得它。
有任何想法吗?
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);