Python 将文本覆盖在pyqt4中的特定小部件(透明标签)上
考虑对@ekhumoro的修改,如下所示 在Python 将文本覆盖在pyqt4中的特定小部件(透明标签)上,python,qt4,pyqt,pyqt4,pyside,Python,Qt4,Pyqt,Pyqt4,Pyside,考虑对@ekhumoro的修改,如下所示 在QWidget中嵌入了一个mplayer。现在我想在视频上覆盖一些文字。但是我下面的方法不起作用(标签的背景不是透明的,人们只能看到视频和文本)。有什么好办法吗 更一般地说:如何在自定义小部件(在我的例子中是mplayer小部件)上放置透明标签 如果不可能完全实现我想要的,那么只显示冻结视频的最后一帧(或预定义帧)并在其上显示一些文本就足够了 请注意,在稍后阶段,我希望覆盖视频的文本随时间而变化,因此解决方案应该已经考虑到这一点 为了提高透明度,需要注
QWidget
中嵌入了一个mplayer。现在我想在视频上覆盖一些文字。但是我下面的方法不起作用(标签的背景不是透明的,人们只能看到视频和文本)。有什么好办法吗
更一般地说:如何在自定义小部件(在我的例子中是mplayer小部件)上放置透明标签
如果不可能完全实现我想要的,那么只显示冻结视频的最后一帧(或预定义帧)并在其上显示一些文本就足够了
请注意,在稍后阶段,我希望覆盖视频的文本随时间而变化,因此解决方案应该已经考虑到这一点
为了提高透明度,需要注意的是,我使用的是linux环境,尤其是在xmonad
下
import mpylayer
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.container = QtGui.QWidget(self)
#self.container.setStyleSheet('background: black')
self.button = QtGui.QPushButton('Open', self)
self.button.clicked.connect(self.handleButton)
self.layout = QtGui.QVBoxLayout(self)
self.layout.addWidget(self.button)
self.layout.addWidget(self.container)
self.mplayer = mpylayer.MPlayerControl(
'mplayer', ['-wid', str(self.container.winId())])
self.label = QtGui.QLabel('Some text\n and more',self)
self.label.move(100,100)
self.label.setGeometry(200,200,900,300)
#This doesn't work
self.label.setAttribute(QtCore.Qt.WA_TranslucentBackground)
#opacity doesn't work
self.label.setStyleSheet("QLabel {font-size: 100px; opacity:0.5}")
def handleButton(self):
path = QtGui.QFileDialog.getOpenFileName()
if not path.isEmpty():
self.mplayer.loadfile(unicode(path))
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())
以下是我的非工作方法的屏幕截图:
下面是我想用gimp
伪造的东西(也许我应该用红色字体,但那应该只是简单的css):
编辑
下面是我如何尝试将X.Jacobs的答案改编为我的示例。但是它不起作用。仅当我调整窗口大小时,叠加的文本/线条在视频上仅出现一毫秒,然后再次消失(在这两种情况下,如果视频正在运行,或者视频正在暂停)
签出此示例覆盖小部件,以适应您的需要:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class overlay(QWidget):
def __init__(self, parent=None):
super(overlay, self).__init__(parent)
palette = QPalette(self.palette())
palette.setColor(palette.Background, Qt.transparent)
self.setPalette(palette)
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.fillRect(event.rect(), QBrush(QColor(255, 255, 255, 127)))
painter.drawLine(self.width()/8, self.height()/8, 7*self.width()/8, 7*self.height()/8)
painter.drawLine(self.width()/8, 7*self.height()/8, 7*self.width()/8, self.height()/8)
painter.setPen(QPen(Qt.NoPen))
class windowOverlay(QWidget):
def __init__(self, parent=None):
super(windowOverlay, self).__init__(parent)
self.editor = QTextEdit()
self.editor.setPlainText("OVERLAY"*100)
self.button = QPushButton("Toggle Overlay")
self.verticalLayout = QVBoxLayout(self)
self.verticalLayout.addWidget(self.editor)
self.verticalLayout.addWidget(self.button)
self.overlay = overlay(self.editor)
self.overlay.hide()
self.button.clicked.connect(lambda: self.overlay.setVisible(False) if self.overlay.isVisible() else self.overlay.setVisible(True))
def resizeEvent(self, event):
self.overlay.resize(event.size())
event.accept()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
main = windowOverlay()
main.show()
sys.exit(app.exec_())
要覆盖文本,请使用以下内容:
class overlayLabel(QLabel):
def __init__(self, parent=None):
super(overlayLabel, self).__init__(parent)
self.setAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
self.setText("OVERLAY TEXT")
谢谢,但我真的不明白它的用途/如何应用。对我来说,这似乎只会让文字变成灰色。。。关键是,我只想看到背景中的(黑色)文本和视频,而不想看到隐藏视频部分的标签背景…@student see my,我修改了它以使覆盖更明显。如果我理解正确,
overlay
类将替换我文章中示例中的标签,QTextEdit
对应于我的mplayer
容器?如果是这样,我怎么能在你的overlay
类中编写文本(而不是画一些线)?@student checkout my,我添加了一个overlayLabel
,它在QWidget
上显示文本。我不知道pyQt是如何工作的,但你可能想查看QWidgets的自动填充背景设置,并确保你的覆盖是假的。您可能还想查看一些相关的窗口提示(在autoFillBackground设置的文档中提到)。
class overlayLabel(QLabel):
def __init__(self, parent=None):
super(overlayLabel, self).__init__(parent)
self.setAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
self.setText("OVERLAY TEXT")