首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QGraphicsColorizeEffect应用于QGraphicsSvgItem的一部分(仅适用于svg本身)

将QGraphicsColorizeEffect应用于QGraphicsSvgItem的一部分(仅适用于svg本身)
EN

Stack Overflow用户
提问于 2015-10-21 15:16:02
回答 1查看 1.3K关注 0票数 1

我有一个QGraphicsSvgItem子类,我想在其中修改svg颜色。我想使用这个QGraphicsColorizeEffect,它工作得很好。

我的项目也有一个自定义选择矩形,突出显示-类似于其他项目类型。

当我应用着色效果时,高亮点也会变成相同的颜色.

我试过在油漆中加入setEnabled(false);,但似乎没有效果。

样本代码:

文件mysvg.h

代码语言:javascript
复制
#ifndef MYSVG_H
#define MYSVG_H

#include <QGraphicsSvgItem>
#include <QGraphicsColorizeEffect>

class MySvg : public QGraphicsSvgItem
{
public:
    MySvg();
    ~MySvg();
    virtual void paint(QPainter* painter,
                       const QStyleOptionGraphicsItem* option,
                       QWidget* widget = NULL);
private:
    QGraphicsColorizeEffect* m_effect;
    void drawSelectionRectangle(QPainter* painter, const QStyleOptionGraphicsItem* option, const QRectF& rectangle);
};
#endif // MYSVG_H

文件mysvg.cpp

代码语言:javascript
复制
#include <QStyleOptionGraphicsItem>
#include <QStyle>
#include <QPainterPath>
#include <QPainter>
#include <QFileDialog>
#include <QSvgRenderer>

MySvg::MySvg()
{
    m_effect = new QGraphicsColorizeEffect();
    m_effect->setColor(Qt::red);
    setGraphicsEffect(m_effect);
    setFlags(QGraphicsItem::ItemIsMovable    |
             QGraphicsItem::ItemIsFocusable  |
             QGraphicsItem::ItemIsSelectable);

    QString filename = QFileDialog::getOpenFileName(0, tr("Open Svg File"),
                     QString(), tr("Svg files (*.svg *.svgz)"));
    setSharedRenderer(new QSvgRenderer(filename));
}

MySvg::~MySvg()
{
    delete renderer();
    delete m_effect;
}

void MySvg::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QStyleOptionGraphicsItem opt(*option);
    opt.state = QStyle::State_None;

    QGraphicsSvgItem::paint(painter, &opt, widget);

    //m_effect->setEnabled(false);  // no effect though seemed logical
    QRectF rectangle = boundingRect();
    if (option->state & (QStyle::State_Selected))
        drawSelectionRectangle(painter, option, rectangle);
    //m_effect->setEnabled(true);
}

void MySvg::drawSelectionRectangle(QPainter *painter, const QStyleOptionGraphicsItem *option, const QRectF &rectangle)
{
    painter->setPen(QPen(option->palette.windowText(), 0, Qt::DotLine));
    painter->setBrush(QColor(255, 188, 0, 50));
    painter->drawRect(rectangle);
}

文件main.cpp

代码语言:javascript
复制
#include <QApplication>
#include <QGraphicsView>
#include "mysvg.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QGraphicsScene s;
    QGraphicsView view;
    view.setScene(&s);
    s.setSceneRect(-50, -50, 500, 650);
    view.show();
    MySvg* svg = new MySvg();
    s.addItem(svg);
    return app.exec();
}

文件mysvg.pro

代码语言:javascript
复制
QT       += core gui svg
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = mysvg
TEMPLATE = app
SOURCES += main.cpp \
           mysvg.cpp
HEADERS +=  mysvg.h

我已经考虑过让QGraphicsSvgItem成为MySvg项目的私有成员--但是MySvg项需要做很多其他的事情,而且我不知道如何处理呈现器(谁将拥有它.)--如果我能够想出如何使QGraphicsSvgItem子类成为MySvg类的成员,我就可以将着色应用于成员并对MySvg项执行所有其他操作.

请帮我找出一种方法,把颜色应用到svg,而不是其他绘图部分的项目。

编辑-我尝试向类中添加一个成员项并将着色效果应用于成员--但是它根本没有应用着色效果.svg装载所有原始颜色。

下面是包含成员项的代码:

新没药

代码语言:javascript
复制
class SvgMember : public QGraphicsSvgItem
{
public:
    SvgMember (const QByteArray &content, const QColor& c);
    ~SvgMember ();
private:
    QGraphicsColorizeEffect* m_effect;
};

class MySvg : public QGraphicsItem
{
public:
    MySvg();
    ~MySvg();
    virtual void paint(QPainter* painter,
                       const QStyleOptionGraphicsItem* option,
                       QWidget* widget = NULL);
    virtual QRectF boundingRect() const;
    virtual QPainterPath shape() const;

private:
    void drawSelectionRectangle(QPainter* painter, const QStyleOptionGraphicsItem* option, const QRectF& rectangle);
    SvgMember * m_member;
};

新mysvg.cpp

代码语言:javascript
复制
MySvg::MySvg()
{
    setFlags(QGraphicsItem::ItemIsMovable    |
             QGraphicsItem::ItemIsFocusable  |
             QGraphicsItem::ItemIsSelectable);

    QString filename = QFileDialog::getOpenFileName(0, QObject::tr("Open Svg File"),
                     QString(), QObject::tr("Svg files (*.svg *.svgz)"));
    QFile f(filename);
    f.open(QFile::ReadOnly | QFile::Text);
    QByteArray svgContents = f.readAll();
    f.close();
    m_member = new SvgMember (svgContents, Qt::red);
}

MySvg::~MySvg()
{ 
    delete m_member;
}

void MySvg::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QStyleOptionGraphicsItem opt(*option);
    opt.state = QStyle::State_None;

    m_member->paint(painter, &opt, widget);

    QRectF rectangle = boundingRect();
    if (option->state & (QStyle::State_Selected))
        drawSelectionRectangle(painter, option, rectangle);
}

/*! \brief reimplemented to use member rectangle */
QRectF MySvg::boundingRect() const
{
    return m_member->boundingRect();
}

/*! \brief reimplemented to use member shape */
QPainterPath MySvg::shape() const
{
    return m_member->shape();
}

void MySvg::drawSelectionRectangle(QPainter *painter, const QStyleOptionGraphicsItem *option, const QRectF &rectangle)
{
    painter->setPen(QPen(option->palette.windowText(), 0, Qt::DotLine));
    painter->setBrush(QColor(255, 188, 0, 50));
    painter->drawRect(rectangle);
}

SvgMember ::SvgMember (const QByteArray &content, const QColor &c)
{
    m_effect = new QGraphicsColorizeEffect();
    setGraphicsEffect(m_effect);
    m_effect->setColor(c);
    setSharedRenderer(new QSvgRenderer(content));
}

SvgMember ::~SvgMember ()
{
    delete renderer();
    delete m_effect;
}

如何将着色效果应用于svg -但不应用于选择矩形?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-23 21:45:52

其效果是基类QGraphicsItem的一个特性。它应用于整个图形项及其所有子项目。因此,在项目中绘制的所有内容都会受到其效果的影响。

选择矩形应绘制在SVG项对象之外。它可以通过复合类QGraphicsSvgItem封装QGraphicsItemGroup来实现。

QGraphicsItem被添加到QGraphicsItemGroup中时,它就会被修复。因此,当组对象被销毁时,项被销毁。因此,不需要手动删除它。QGraphicsItem拥有效果的所有权,因此不需要删除effect对象。

下面的类MyGraphicsItemGroup如您所期望的那样工作。

实施"mygraphicsitemgroup.cpp“

代码语言:javascript
复制
#include "mygraphicsitemgroup.h"

#include <QGraphicsColorizeEffect>
#include <QGraphicsSvgItem>
#include <QStyleOptionGraphicsItem>
#include <QPainter>
#include <QFileDialog>

MyGraphicsItemGroup::MyGraphicsItemGroup()
{
    setFlags(QGraphicsItem::ItemIsMovable    |
             QGraphicsItem::ItemIsFocusable  |
             QGraphicsItem::ItemIsSelectable);

    QString filename = QFileDialog::getOpenFileName(0,
        QObject::tr("Open Svg File"), QString(),
        QObject::tr("Svg files (*.svg *.svgz)"));

    QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect();
    effect->setColor(Qt::red);

    QGraphicsSvgItem *svg = new QGraphicsSvgItem(filename);
    svg->setGraphicsEffect(effect);
    addToGroup(svg);
}

void MyGraphicsItemGroup::paint(QPainter* painter,
    const QStyleOptionGraphicsItem* option, QWidget* widget)
{
    QStyleOptionGraphicsItem opt(*option);
    opt.state = QStyle::State_None;
    QGraphicsItemGroup::paint(painter, &opt, widget);

    QRectF rectangle = boundingRect();
    if (option->state & QStyle::State_Selected)
        drawSelectionRectangle(painter, option, rectangle);
}

void MyGraphicsItemGroup::drawSelectionRectangle(QPainter *painter,
    const QStyleOptionGraphicsItem *option, const QRectF &rectangle)
{
    painter->setPen(QPen(option->palette.windowText(), 0, Qt::DotLine));
    painter->setBrush(QColor(255, 188, 0, 50));
    painter->drawRect(rectangle);
}

标题“mygraphicsitemgroup.h.h”

代码语言:javascript
复制
#ifndef MYGRAPHICSITEMGROUP_H
#define MYGRAPHICSITEMGROUP_H

#include <QGraphicsItemGroup>

class MyGraphicsItemGroup : public QGraphicsItemGroup
{
public:
    MyGraphicsItemGroup();

    virtual void paint(QPainter* painter,
        const QStyleOptionGraphicsItem* option, QWidget* widget);

    void drawSelectionRectangle(QPainter *painter,
        const QStyleOptionGraphicsItem *option, const QRectF &rectangle);
};

#endif // MYGRAPHICSITEMGROUP_H
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33263082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档