Как я могу изменить геометрию виджета Qt, сохраняя позиции своих детей на экране? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть виджет с дочерним виджетом внутри.Размер основного виджета может быть изменен во время выполнения, потому что мне нужна дополнительная область для рисования динамического содержимого, а когда я закончу, мне бы хотелось, чтобы он восстановил свой предыдущий размер.

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

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

Как я могуизбавиться от этих мерцаний?Или есть ли лучший подход? Любая помощь будет оценена.

Вот код (при нажатии на изображение переключается размер):

from PyQt5.QtCore import Qt, QPoint, QSize
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPixmap

import sys


class Child(QWidget):

    def __init__(self, parent):
        super().__init__(parent)
        self.setFixedSize(100, 100)

    def paintEvent(self, event):
        painter = QPainter(self)
        # the longer it costs to paint, the easier it is to reproduce the flicker
        for i in range(500):
            painter.drawPixmap(event.rect(), QPixmap("some picture"))
        painter.end()


class MyWidget(QWidget):

    def __init__(self):
        super().__init__()
        self._state = 0
        self._child = Child(self)
        self._child.move(0, 0)
        self.setFixedSize(100, 100)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            delta = QPoint(50, 50)
            if self._state:
                delta = -delta
            self._state ^= 1

            self._child.move(self._child.pos() + delta)
            self.setFixedSize(self.size() + QSize(delta.x(), delta.y()))
            self.move(self.pos() - delta)


def main():
    app = QApplication(sys.argv)
    w = MyWidget()
    w.move(200, 200)
    w.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
...