#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
.