QSplashScreen.setPixmap возвращает Splashscreen обратно в положение по умолчанию

Я создал QSplashScreen с QPixmap и переместил его в центр моего второго монитора (не монитора по умолчанию):

class SplashScreen(QSplashScreen):
  def __init__(self):
    self._pixmap = QPixmap("test1.png")
    super(SplashScreen, self).__init__(self._pixmap)

    screen = 1
    scr = qApp.desktop().screenGeometry(screen)
    self.move(scr.center() - self.rect().center()) # move to second screen

Сейчас я пытаюсь добавить что-то в мое растровое изображение, пока отображается SplashScreen:

  def drawSomething(self):
    add = QPixmap('test2.png')
    painter = QPainter(self._pixmap)
    painter.drawPixmap(0,0, add)
    #nothing happing so far
    self.repaint() # nothing happening
    self.setPixmap(self._pixmap) # changes shown, but moved back to default-screen

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

Кроме того, используя setPixmap() перемещает SplashScreen обратно на монитор по умолчанию.


Есть ли возможность непосредственно рисовать на активном QPixmap Splashscreen или устанавливать новый, не нуждаясь в повторном перемещении экрана?

(использование команды перемещения не кажется хорошим вариантом, когда вы быстро перерисовываете за короткий промежуток времени - заставка вспыхивает на обоих мониторах)


пример использования:

app = QApplication([])
splash = SplashScreen()
splash.show()
splash.drawSomething()
exit(app.exec_())

2 ответа

Решение

Я наконец-то добился успеха с повторной реализацией paintEvent с QPainter на self:

def paintEvent(self, *args, **kwargs):
    painter = QPainter(self)
    pixmap = QPixmap('test2.png')
    #self.setMask(pixmap.mask()) # optional for transparency painting
    painter.drawPixmap(0,0, pixmap)

Тем не менее, переопределение drawContents Функционал, подобный предложенному С.Монтелеоне, тоже работал нормально:

def drawContents(self, painter):
    painter.drawPixmap(0,0, QPixmap('test2.png'))
    super(SplashScreen, self).drawContents(painter)

Не забудьте также позвонить в super, после того, как вы покрасили, чтобы не потерять рисунок сообщений, показанный на QSplashScreen.

Реализация по умолчанию рисует сообщение, переданное showMessage().

Вам следует переопределить функцию drawContents, чтобы выполнить рисование на QSplashScreen QPixmap.

Другие вопросы по тегам