0

我创建了一个带有QPixmap的QSplashScreen并将其移动到我的第二个监视器(不是默认监视器)的中心:

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

似乎用于创建 QSplashScreen 的 QPixmap 已被复制并且不再是相同的引用,因此对此的更改没有直接影响。

此外,使用setPixmap()将 SplashScreen 移回默认监视器上。


是否可以选择直接在 Splashscreen 的活动 QPixmap 上绘制或设置新的而不需要再次移动屏幕?

(使用 move-command 似乎不是一个好的选择,当您在短时间内快速重新绘制时 - 启动画面会在两台显示器上闪烁)


用法示例:

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

2 回答 2

1

您应该重新实现drawContents函数以在 QSplashScreen QPixmap 上执行绘画。

于 2018-04-14T13:45:38.150 回答
0

我终于成功地用paintEventonQPainter重新实现了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)

但是,重新实现像 S.Monteleone 建议的drawContents功能可以正常工作:

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

记得在绘画之后也调用 super,以免丢失QSplashScreen 上显示的消息绘图。

默认实现绘制由 showMessage() 传递的消息。

于 2018-04-16T10:59:11.517 回答