Qgrap Scene: Изменение высоты QGraphicRects применяется только после второго запуска

#qt #pyside #qgraphicsitem

#qt #pyside #qgraphicsitem

Вопрос:

Я программирую график со столбцами в QGraphicsScene использовании QGraphicRectItems . Пока все работает, но кажется, что я меняю высоту QGraphicsRectItems сразу после ее создания с помощью setRect , высота не применяется. Как ни странно, при повторном запуске программы высота всегда изменяется на одни и те же «случайные» значения.

Если я изменю высоту QGraphicsRect s еще раз, используя ту же функцию, все заработает. Есть ли что-нибудь, что мне нужно сделать после создания QGraphicsRect , чтобы «зарегистрировать» его или что-то в этом роде?

Редактировать:

То же самое произойдет, если я снова изменю высоты. Мне нужно сделать это дважды, чтобы столбцы правильно отрегулировали свою высоту.

Код:

В моей функции я изменяю высоту (сложенного) QGraphicsRectItems с:

 accH = 0
for i, h in enumerate(data):
    geo = rects[i].rect()
    print "beforettt", geo
    print "target heighttt", h
    geo.setHeight(h)
    geo.setY(accH)
    rects[i].setRect(geo)
    print "changed geometryt", geo
    print "geometry of updated rect", rects[i].rect()
    print "___"

    accH  = h
print "-----"
  

rects это список ранее созданных QGraphicsItem файлов.

Вывод приведенных выше инструкций печати с помощью data = [ 98. 263. 6710. 0.] :

Первый запуск:

 before                  PySide.QtCore.QRectF(0.000000, 0.000000, 1.000000, 98.000000)
target height           98.0
changed geometry        PySide.QtCore.QRectF(0.000000, 0.000000, 1.000000, 98.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 0.000000, 1.000000, 98.000000)
___
before                  PySide.QtCore.QRectF(0.000000, 98.000000, 1.000000, 166.000000)
target height           263.0
changed geometry        PySide.QtCore.QRectF(0.000000, 98.000000, 1.000000, 263.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 98.000000, 1.000000, 263.000000)
___
before                  PySide.QtCore.QRectF(0.000000, 361.000000, 1.000000, 6351.000000)
target height           6710.0
changed geometry        PySide.QtCore.QRectF(0.000000, 361.000000, 1.000000, 6710.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 361.000000, 1.000000, 6710.000000)
___
before                  PySide.QtCore.QRectF(0.000000, 7071.000000, 1.000000, -7068.000000)
target height           0.0
changed geometry        PySide.QtCore.QRectF(0.000000, 7071.000000, 1.000000, 0.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 7071.000000, 1.000000, 0.000000)
___
  

Второй запуск:

 before                  PySide.QtCore.QRectF(0.000000, 0.000000, 1.000000, 98.000000)
target height           98.0
changed geometry        PySide.QtCore.QRectF(0.000000, 0.000000, 1.000000, 98.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 0.000000, 1.000000, 98.000000)
___
before                  PySide.QtCore.QRectF(0.000000, 98.000000, 1.000000, 263.000000)
target height           263.0
changed geometry        PySide.QtCore.QRectF(0.000000, 98.000000, 1.000000, 263.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 98.000000, 1.000000, 263.000000)
___
before                  PySide.QtCore.QRectF(0.000000, 361.000000, 1.000000, 6710.000000)
target height           6710.0
changed geometry        PySide.QtCore.QRectF(0.000000, 361.000000, 1.000000, 6710.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 361.000000, 1.000000, 6710.000000)
___
before                  PySide.QtCore.QRectF(0.000000, 7071.000000, 1.000000, 0.000000)
target height           0.0
changed geometry        PySide.QtCore.QRectF(0.000000, 7071.000000, 1.000000, 0.000000)
geometry of updated rect PySide.QtCore.QRectF(0.000000, 7071.000000, 1.000000, 0.000000)
___
  

То, что я только что понял, готовя этот вывод для stackoverflow, проблема, похоже, в том, что высота каждого из них QGraphicsRectItem является правильной height — своей y value . Я попытался сначала сделать setY , а затем setHeight на geo выше. Затем отпечатки показывают, что геометрия (rect) QGraphicsRects правильна. Но на QGraphicsView я не вижу никаких изменений.

Комментарии:

1. Не могли бы вы отредактировать свой пост, написав свой код, пожалуйста?

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

3. пробовал вызывать QGraphicsScene::update после изменения высоты?

4. да, и это не помогает. QGraphicRects Созданы правильно. Если я не изменяю их размер, они отображаются правильно. Но если я коснусь их размера, высота будет установлена на странные значения.

5. Я добавил некоторые выходные данные отладки. Проблема, похоже, в том, что я изменяю y и height QRect одновременно, поскольку y это вычитается из общего height

Ответ №1:

В конце концов я нашел решение своей проблемы.

Что нужно сделать, так это вызвать setY перед setHeight QRect определением геометрии QGraphicsRect .