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.