Почему дочерний QGraphicsObject не перерисовывает свой фон правильно - PullRequest
0 голосов
/ 13 марта 2019

enter image description here

Объект QGraphicsObject в зеленом прямоугольнике, он является родителем объекта QGraphicsObject в красном прямоугольнике.

childInRed->setParentItem(this);

Когда я перетаскиваю родительский объект в зеленый прямоугольник и быстро его перемещаю, фон дочернего объекта в красном прямоугольнике перекрашивается неправильно. enter image description here

Я знаю, что могу использовать update в mouseMoveEvent родителя, чтобы заставить ребенка перерисоваться. Но это нехорошо, потому что мне совсем не нужно перекрашивать родителя.


#include "asdf.h"
#include <QtWidgets/QGraphicsScene>
#include <QtWidgets/QGraphicsView>

#include <QtWidgets>

class CTestGraphicsObject : public QGraphicsObject
{
public:
    QColor m_c;
    CTestGraphicsObject(QColor c)
        : QGraphicsObject(NULL)
        , m_c(c)
    {
        setFlag(QGraphicsItem::ItemIsMovable, true);
        setFlag(QGraphicsItem::ItemIsFocusable, true);
        setFlag(QGraphicsItem::ItemIsSelectable, true);

        auto effect = new QGraphicsDropShadowEffect;
        effect->setOffset(4, 4);
        effect->setBlurRadius(20);

        setGraphicsEffect(effect);
    }
    virtual QRectF boundingRect() const override
    {
        auto rc = QRectF(0, 0, 100, 100);
        return rc;
    }
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {
        painter->setPen(QPen(m_c));
        painter->drawRect(this->boundingRect());
    }
};

asdf::asdf(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    auto s = new QGraphicsScene(this);
    auto v = new QGraphicsView;
    v->setScene(s);

    CTestGraphicsObject* pParent = new CTestGraphicsObject(Qt::green);
    CTestGraphicsObject* pChild = new CTestGraphicsObject(Qt::red);
    pChild->setParentItem(pParent);
    pChild->setPos(0, 100);
    s->addItem(pParent);
    s->addItem(pChild);

    QVBoxLayout* l = new QVBoxLayout(this->centralWidget());
    l->addWidget(v);
}

asdf::~asdf()
{

}

QGraphicsDropShadowEffect вызывает эту проблему. Кажется, я не правильно его использую.

1 Ответ

1 голос
/ 13 марта 2019

Согласно документации Qt , сцена использует ограничивающий прямоугольник и область , чтобы определить область, которую нужно перекрасить при обновлении элемента (перемещенном в вашем случае).

Если ваш ребенок находится за пределами своего родителя, сцена будет пропускать некоторую часть при перерисовке ...

Расширение строящегося прямоугольника / области , чтобы охватить его потомков.

Если вы сделаете что-то подобное, это сработает:

    virtual QRectF boundingRect() const override
    {
        if (this->childrenBoundingRect().isEmpty()) // No children
            return QRectF(0, 0, 100, 100);
        return QRectF(0, 0, 100, 100).united(this->childrenBoundingRect());
    }
    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {
        painter->setPen(QPen(m_c));
        painter->drawRect(QRectF(0, 0, 100, 100));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...