LINUX.ORG.RU

QSlider, QGraphicsTextItem и его перерисовка

 ,


0

2

Оригинал тут

Суть: есть слайдер, для него заданы шаги, отрисованы интервалы и т.п. И при работе с клавиатуры он вполне их слушается. Но если его тащить мышью - он забивает на все эти шаги и ползет без всяких привязок к ним.

Это первая проблема. Вторая - эта штука должна при изменении значений вызывать функцию перерисовки QGraphicsTextItem. Но проблема в том, что оно ни разу не перерисовывает ничего, хотя нужные значения сам TextItem получает (видно в print(self.x_coord.toPlainText()))

self.scene.update(), self.repaint() делал, успех нулевой.

По сравнению с кодом по ссылке добавил resizeEvent (кстати при изменении размера окна работает, все рисует) и поменял self.x_coord на global x_coord.

убил уже два дня. ЧЯНТД?

★★★★★
Ответ на: комментарий от GateKeeper

сделал. результат - ноль внимания, фунт презрения

upcFrost ★★★★★
() автор топика

Проверил еще пачку вызовов. Прикол в том, что из «левой» функции (не-Event, просто своя функция) оно прекрасно взаимодействует с QGraphicsScene, но при этом ничерта не отрисовывает. Удалает объекты, добаляет, меняет - все делает, кроме собственно того, что оно должно делать (отображать)

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

Попробую помочь, предугадать.

self.scene.update(), self.repaint() делал, успех нулевой.

Это скорее всего работать и не должно.

Public Slots
void invalidateScene
void updateScene
void updateSceneRect

У вьюшки - кеширование, или выше методами попробуй или поменяй режимы.

enum QGraphicsView::ViewportUpdateMode.
QGraphicsView::FullViewportUpdate
QGraphicsView::MinimalViewportUpdate - это дефолт.
QGraphicsView::SmartViewportUpdate
QGraphicsView::BoundingRectViewportUpdate
QGraphicsView::NoViewportUpdate

zJes ★★
()

нашел решение. фак, хрен додумаешься.

короче, оно перерисовывается только когда вызван paintEvent. Надо все рисование делать в нем, а после задания координаты дать self.graph.invalidateScene(). А в самом paintEvent вызвать viewport().update()

def setCoordLabelValue(self):
        x = self.ui.x_coord.value()/1000
        y = self.ui.y_coord.value()/1000
        self.graph.setCoordText(x,y)
        self.graph.invalidateScene()

.......

def paintEvent(self, event):
            painter = QtGui.QPainter(self.viewport())

            # set color and width of line drawing pen
            painter.setPen(QtGui.QPen(QtCore.Qt.black, 2))

            # drawLine(x1, y1, x2, y2) from point (x1,y1) to (x2,y2)
            # draw the baseline
            painter.drawText(10,20,str(x_coord))
            # set up color and width of the bars
            width = 20
            painter.setPen(QtGui.QPen(QtCore.Qt.red, width))
            delta = width + 5
            x = 30
            painter.end()

            self.viewport().update()

Причем при таком варианте оно игнорит все showEvent и resizeEvent, что самое забавное

upcFrost ★★★★★
() автор топика

C PyQt не возился, но с Tkinter была похожая проблема. Когда перерисовка одного кадра проскакивает слишком быстро, он начинает чудить (то ли хрень какая то с очередью сообщений, то ли еще чего) и нефига не перирисосвывает. Спасает time.sleep(скока то мс) в ф-ии отрисовки.

AIv ★★★★★
()
Ответ на: комментарий от upcFrost

Кстати тоже решение кривое. Теперь оно перерисовывает непрерывно, т.к. update вызывается прямо из функции перерисовки. Зато из другого места он не работает. Бред

upcFrost ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.