qt4: вызов update () для одного QGraphicsItem вызывает paint () для ВСЕГО QGraphicsItem - PullRequest
1 голос
/ 26 июня 2019

Резюме

Я использую QT 4.8.7 под SUSE 64 бит

У меня есть 2 QGraphicsItem с различной частотой обновления. Но когда я вызываю update () для одного из них, paint () вызывается для них обоих. Таким образом, реальная закуска для обоих предметов - это наивысший общий коэффициент двух напитков.

Я хотел бы иметь независимые вызовы методов paint () ... Я понятия не имею, откуда возникает эта проблема и как ее решить (я пытался вызвать QGraphicsItem :: update (QRectF (// item_dimensions //)) "вместо QGraphicsItem :: update (), но проблема та же)

Упрощенный код

toto.hpp

class Toto : public QObject, QGraphicsItem
{

    Q_OBJECT

    public:
    Toto(QString name)
    {
        m_name = name;
    }

    void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget* = NULL)
    {
        QTextStream(stdout) << "paint : " << m_name << endl;
        //other stuff
    }

    public slots:
    void updateSlot()
    {
        QTextStream(stdout) << "\nupdate : " << m_name << endl;
        QGraphicsItem::update();
    }


    private:
    QString m_name;
}

main.cpp

Toto1 = new Toto("toto_1");
Toto2 = new Toto("toto_2");

QTimer *timer1 = new QTimer(500);
QTimer *timer2 = new QTimer(2000);

connect(timer1, SIGNAL(timeout()), toto1, SLOT(updateSlot()));
connect(timer2, SIGNAL(timeout()), toto2, SLOT(updateSlot()));

timer1->start();
timer2->start();

Ожидаемый результат:

toto_1 update
toto_1 paint

toto_1 update
toto_1 paint

toto_1 update
toto_1 paint

toto_1 update
toto_1 paint

toto_2 update
toto_2 paint

toto_1 обновляется каждые 500 мс, toto_2 обновляется каждые 2000 мс

Что я получу:

toto_1 update
toto_1 paint
toto_2 paint

toto_1 update
toto_1 paint
toto_2 paint

toto_1 update
toto_1 paint
toto_2 paint

toto_1 update
toto_1 paint
toto_2 paint

toto_2 update
toto_1 paint
toto_2 paint

toto_1 и toto_2 обновляются каждые 500 мс

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 16 июля 2019

Я не уверен, что это может быть проблемой, поскольку у меня нет всей информации, но вы можете стать жертвой побочного эффекта, который задокументирован в методе QGraphicsItem :: update (), а именно:

В качестве побочного эффекта перекрашиваемого элемента, другие элементы, которые перекрывают область rect , также могут быть перекрашены.

Это цитата из документации Qt4относительно QGraphicsItem :: update (), который вы можете проверить сами здесь .

...