2015-07-14 10 views
1

Я некоторое время работаю с QGraphicsView, и я столкнулся с реквизитом, который я не уверен, может ли он быть выполнен с использованием этой структуры.Qt: Перекрытие полупрозрачного QgraphicsItem

Полагая это как можно более простым, у меня есть 2 перекрывающих RectItem с полупрозрачным QBrush (тот же самый для обоих). Возможно ли предотвратить перекрытие перекрывающейся области? Я просто хочу, чтобы вся область имела тот же цвет (это произойдет только в том случае, если оба прямоугольника полностью непрозрачны, но иногда это не так)

Я знаю, это может показаться странным, но старый графический движок мой его использовали коллеги.

Любые идеи?

+3

Да, это должно быть возможно, используя правильные режимы наложения. Взгляните на [этот пример] (http://doc.qt.io/qt-5/qtwidgets-painting-composition-example.html), который позволит вам экспериментировать с различными режимами смешивания. – TheDarkKnight

+0

Отлично, я посмотрю, спасибо! – zozelfelfo

+0

@ TheDarkKnight благодарит за информацию, но я не могу понять, как ее адаптировать к QGraphicsView. В этой структуре каждый элемент имеет свой собственный QPainter (или, кажется, так), и я не использую изображения:/Я буду продолжать искать – zozelfelfo

ответ

3

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

Очень подробный ответ, спасибо !, Я попробую, и если это сработает, я пометю его как правильно. – zozelfelfo

+1

Это сработало! Я попробовал что-то похожее, но я использовал другой флаг (source_Over или что-то в этом роде, и результата не было :(). Так или иначе, вы сделали мой день! – zozelfelfo