Анимированный задний фон окна

Делаю анимированный задний фон и столкнулся с двумя проблемами:

  1. При отрисовки квадратов у них автоматически рисуется бордюр. Как убрать его?
  2. Отрисовка производится один раз в функции paintEvent. Как эту функцию зациклить, чтобы она вызывалась для перерисовки заднего фона и при этом не вешала форму.

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

Пример:

   from PyQt5 import QtCore, QtGui, QtWidgets
   from PyQt5.QtWidgets import *
   from PyQt5.QtGui import QRadialGradient, QPainter, QPainterPath, QPen, QBrush, QGradient, QColor
   from PyQt5.QtCore import QPointF, Qt, QRect

   class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)

        self.resize(600, 400)

       
    def paintEvent(self, event):

        painter = QPainter(self)

        radialGrad = QRadialGradient(QPointF(300, 450), 200)
        
        radialGrad.setColorAt(0, QColor('#1B2735'))
        radialGrad.setColorAt(1, QColor('#090A0F'))

        painter.setBrush(radialGrad)
        painter.drawRect(0, 0, 600, 400) 

        painter.setBrush(QBrush(Qt.white))
        painter.drawRect(100, 390, 2, 2) 
        painter.drawRect(200, 390, 3, 3) 
        painter.drawRect(300, 390, 4, 4)

   if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Обратите внимание на self.rect(). self.height() и setPen()

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QRadialGradient, QPainter, QPainterPath, QPen, QBrush, QGradient, QColor
from PyQt5.QtCore import QPointF, Qt, QRect

class MainWindow(QtWidgets.QMainWindow):
 def __init__(self):
     super().__init__()

     self.centralwidget = QtWidgets.QWidget()
     self.setCentralWidget(self.centralwidget)

     self.resize(600, 400)


 def paintEvent(self, event):
     painter = QPainter(self)
     '''
     radialGrad = QRadialGradient(QPointF(300, 450), 200)
     radialGrad.setColorAt(0, QColor('#1B2735'))        
     radialGrad.setColorAt(1, QColor('#090A0F'))         
     painter.setBrush(radialGrad)
     '''
     radialGrad = QRadialGradient(0.3, 0.7, 0.05)
     radialGrad.setCoordinateMode(QGradient.ObjectBoundingMode)
     radialGrad.setSpread(QGradient.ReflectSpread)
     radialGrad.setColorAt(0, QColor('#0250c5'))
     radialGrad.setColorAt(1, QColor('#2575fc'))
     painter.setBrush(radialGrad)
     
#     painter.drawRect(0, 0, 600, 400) 
     painter.drawRect(self.rect())                                    # +++ rect

     painter.setBrush(QBrush(Qt.white))  # white red
     painter.setPen(QtGui.QPen(QtCore.Qt.red, -1))                    # +++
     painter.drawRect(100,  self.height()-12, 2, 2)                 # +++ height
     painter.drawRect(200, self.height()-12, 3, 3)                    # +++ height
     painter.drawRect(300, self.height()-12, 4, 4)                    # +++ height


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка