Qt обеспечивает различные режимы смешивания (состава) для QPainter. Вывод вашего класса RectItem из QGraphicsItem или QGraphicsObject позволяет настраивать картину и использовать composition modes, создавать различные эффекты, как показано в Qt Example.
Если вы хотите, чтобы два полупрозрачных элемента перекрывались, не меняя цвет (при условии, что их цвет одинаков), это сделает QPainter::CompositionMode_Difference mode или 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);
Да, это должно быть возможно, используя правильные режимы наложения. Взгляните на [этот пример] (http://doc.qt.io/qt-5/qtwidgets-painting-composition-example.html), который позволит вам экспериментировать с различными режимами смешивания. – TheDarkKnight
Отлично, я посмотрю, спасибо! – zozelfelfo
@ TheDarkKnight благодарит за информацию, но я не могу понять, как ее адаптировать к QGraphicsView. В этой структуре каждый элемент имеет свой собственный QPainter (или, кажется, так), и я не использую изображения:/Я буду продолжать искать – zozelfelfo