PyQt中的透明QSplashScreen图像上有白边
我在谷歌上找了很多资料,但还是搞不清楚怎么去掉我在QSplashScreen上显示的png周围的白色边框。
我看过这篇文章,但是我不知道怎么把里面的内容用到PyQt上,或者说这是不是我真正想要的。
我甚至尝试单独设置黑白蒙版,结果出来的效果很差,到处都是小点点。
有没有人找到过那种神奇的半透明SplashScreen,可以同时显示文本数据,比如用showMessage命令那样?提前谢谢大家。
我还得提一下,我是在Windows 7上操作的。
下面是我用作启动图像的测试PNG,以及我得到的那个丑陋的白色边框:
通过QBitmap提供黑白透明度的另一种方法,虽然效果更接近,但看起来更丑,满是奇怪的小点。代码和图片如下。
splash_pix = QPixmap(":/images/images/PyQtSplash.png")
splash = QSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
splash.setMask(QBitmap(QPixmap(":/images/images/PyQtSplashAlpha.jpg")))
1 个回答
3
只要你使用的图片有干净的透明区域,就只需要把它的遮罩传递给 QSplashScreen.setMask
就可以了。
这个脚本在我的Linux系统上运行得很好:
from PyQt4 import QtGui, QtCore
def show_splash(path):
image = QtGui.QPixmap(path)
splash = QtGui.QSplashScreen(image)
splash.setAttribute(QtCore.Qt.WA_DeleteOnClose)
splash.setMask(image.mask())
font = QtGui.QFont(splash.font())
font.setPointSize(font.pointSize() + 5)
splash.setFont(font)
splash.show()
QtGui.QApplication.processEvents()
for count in range(1, 6):
splash.showMessage(splash.tr('Processing %1...').arg(count),
QtCore.Qt.AlignBottom | QtCore.Qt.AlignLeft,
QtCore.Qt.white)
QtGui.QApplication.processEvents()
QtCore.QThread.msleep(1000)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
show_splash(sys.argv[1])
app.quit()
编辑
这个自定义的SplashScreen类在Linux和Windows上都应该能产生不错的效果:
from PyQt4 import QtGui, QtCore
class SplashScreen(QtGui.QWidget):
def __init__(self, pixmap):
QtGui.QWidget.__init__(self)
self._pixmap = pixmap
self._message = QtCore.QString()
self._color = QtGui.QColor.black
self._alignment = QtCore.Qt.AlignLeft
self.setWindowFlags(QtCore.Qt.FramelessWindowHint |
QtCore.Qt.WindowStaysOnTopHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setFixedSize(self._pixmap.size())
self.setMask(self._pixmap.mask())
def clearMessage(self):
self._message.clear()
self.repaint()
def showMessage(self, message, alignment=QtCore.Qt.AlignLeft,
color=QtGui.QColor.black):
self._message = QtCore.QString(message)
self._alignment = alignment
self._color = color
self.repaint()
def paintEvent(self, event):
textbox = QtCore.QRect(self.rect())
textbox.setRect(textbox.x() + 5, textbox.y() + 5,
textbox.width() - 10, textbox.height() - 10)
painter = QtGui.QPainter(self)
painter.drawPixmap(self.rect(), self._pixmap)
painter.setPen(QtGui.QColor(self._color))
painter.drawText(textbox, self._alignment, self._message)
def mousePressEvent(self, event):
self.hide()
def show_splash(path):
image = QtGui.QPixmap(path)
splash = SplashScreen(image)
font = QtGui.QFont(splash.font())
font.setPointSize(font.pointSize() + 5)
splash.setFont(font)
splash.show()
QtGui.QApplication.processEvents()
for count in range(1, 6):
splash.showMessage(splash.tr('Processing %1...').arg(count),
QtCore.Qt.AlignCenter, QtCore.Qt.white)
QtGui.QApplication.processEvents()
QtCore.QThread.msleep(1000)
splash.hide()
splash.close()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
show_splash(sys.argv[1])
app.quit()