Qsplashscreen.setpixmap перемещает заставку обратно в положение по умолчанию

Я создал 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 на экране-заставке или установить новый без необходимости снова перемещать экран?

(using the move-command doesn't seems like a good option, when you repaint quickly in a short period of time - the splashscreen then flashes on both monitors)


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

app = QApplication([])
splash = SplashScreen()
splash.show()
splash.drawSomething()
exit(app.exec_())
0
0
291
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

Наконец-то я успешно реализовал 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.

The default implementation draws the message passed by showMessage().

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