4

以下に示すように、@ekhumoroからの回答を変更することを検討してください。

に埋め込まれた mplayer がありQWidgetます。今、私はビデオの上にテキストを重ねたいと思っています。しかし、以下の私のアプローチは機能しません (ラベルの背景は透明ではなく、ビデオとテキストのみが表示されます)。それを修正するアイデアはありますか?

より一般的に: カスタム ウィジェット (私の場合は mplayer-widget) の上に透明なラベルを配置するにはどうすればよいですか?

私が望むものを正確に達成できない場合は、ビデオの最後のフレーム (または定義済みのフレーム) をフリーズし、その上にテキストを表示するだけで十分です。

後の段階で、ビデオにオーバーレイするテキストが時間とともに変化するようにしたいので、ソリューションではこれを既に念頭に置いておく必要があります。

透明性のために、私は 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 の回答を私の例に適応させようとした方法は次のとおりです。しかし、うまくいきません。ウィンドウのサイズを変更した場合にのみ、オーバーレイされたテキスト/行がビデオ上にわずか 1 ミリ秒間表示され、その後再び消えます (ビデオが実行中の場合と一時停止中の場合の両方の場合)。

import mpylayer
from PyQt4 import QtGui, QtCore

class overlayLabel(QtGui.QLabel):    
    def __init__(self, parent=None):        
        super(overlayLabel, self).__init__(parent)
        self.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)

        self.setText("OVERLAY TEXT")
        self.setStyleSheet("QLabel {font-size: 100px;}")
        self.setGeometry(200,200,900,300)

class overlay(QtGui.QWidget):    
    def __init__(self, parent=None):        
        super(overlay, self).__init__(parent)

        palette = QtGui.QPalette(self.palette())
        palette.setColor(palette.Background, QtCore.Qt.transparent)

        self.setPalette(palette)

    def paintEvent(self, event):        
        painter = QtGui.QPainter()
        painter.begin(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.fillRect(event.rect(), QtGui.QBrush(QtGui.QColor(255, 255, 255, 27)))
        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(QtGui.QPen(QtCore.Qt.NoPen))        


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())])



        ## Both versions don't work:

        #self.label = overlay(self.container)
        self.label = overlayLabel(self.container)



    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_())
4

1 に答える 1