【问题标题】:Creating a transparent overlay with qt使用 qt 创建透明覆盖
【发布时间】:2014-11-15 00:00:58
【问题描述】:

我最近一直在学习 python,现在我想(尝试)创建我的第一个真正的应用程序,一个用于 Linux 的字幕播放器。到目前为止,我一直在使用 Greenfish 字幕播放器,它是针对 Windows 用户的,并且在 Linux 中不能正常工作。

我想在qt中创建应用程序,因为我发现透明窗口在tkinter中是不可能的,但是如果有人知道更好的框架,请建议!

现在,在开始之前,我已经研究了几个小时的网络,以了解如何让我的应用程序显示在全屏 Flash 视频上,这似乎是不可能的。然而,前面提到的 GF 字幕播放器在 Windows 中可以做到这一点,但在 Linux 中却没有(可能也是因为它是通过 wine 运行的)。

所以我的问题是,是否可以创建一个保留在全屏 Flash 视频上的透明应用程序,如果可以,您能否指出正确的方向?

提前致谢。

编辑: 这是我一直在尝试的一些示例代码。这段代码生成的窗口不会停留在全屏视频上方

import sys
from PyQt4 import QtGui, QtCore

class mymainwindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint)

app = QtGui.QApplication(sys.argv)
mywindow = mymainwindow()
mywindow.show()
app.exec_()
mywindow.show()

【问题讨论】:

  • 将透明窗口作为屏幕堆栈顶部的部分叠加层应该没有问题。在 Qt 中您需要做的就是设置一个透明的窗口背景颜色(例如通过样式表),然后提升您的窗口以使其位于其他所有内容之上。我不知道你在哪里看,但 QWidget 文档有你需要的一切。事实上,一个字幕“播放器”在 Qt 中大约有 100 行 :)
  • 到目前为止,我尝试过:QtCore.Qt.WindowStaysOnTopHint 将窗口设置在所有其他窗口之上,但是它消失在全屏视频后面。视频设置为全屏模式后是否必须将其置于顶部?
  • 正如之前的评论者所建议的,这应该是一件相当微不足道的事情。请发布 MCV example 来说明您遇到的问题,而不是强迫人们猜测您的代码有什么问题。
  • 抱歉,我还没有开始编写代码,我正在尝试我在初始帖子中编辑的这段代码。

标签: python window pyqt4 stayontop


【解决方案1】:

更新 PyQt5 pip install PyQt5

import sys

from PyQt5 import QtGui, QtCore, uic
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowFlags(
            QtCore.Qt.WindowStaysOnTopHint |
            QtCore.Qt.FramelessWindowHint |
            QtCore.Qt.X11BypassWindowManagerHint
        )
        self.setGeometry(
            QtWidgets.QStyle.alignedRect(
                QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter,
                QtCore.QSize(220, 32),
                QtWidgets.qApp.desktop().availableGeometry()
        ))

    def mousePressEvent(self, event):
        QtWidgets.qApp.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywindow = MainWindow()
    mywindow.show()
    app.exec_()

【讨论】:

    【解决方案2】:

    下面的示例代码将创建一个居中的无框窗口,该窗口应位于 Linux 上所有其他窗口的顶部(您可以单击该窗口将其关闭)。

    import sys
    from PyQt4 import QtGui, QtCore
    
    class mymainwindow(QtGui.QMainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            self.setWindowFlags(
                QtCore.Qt.WindowStaysOnTopHint |
                QtCore.Qt.FramelessWindowHint |
                QtCore.Qt.X11BypassWindowManagerHint
                )
            self.setGeometry(QtGui.QStyle.alignedRect(
                QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter,
                QtCore.QSize(220, 32),
                QtGui.qApp.desktop().availableGeometry()))
    
        def mousePressEvent(self, event):
            QtGui.qApp.quit()
    
    app = QtGui.QApplication(sys.argv)
    mywindow = mymainwindow()
    mywindow.show()
    app.exec_()
    

    【讨论】:

    • 只有在游戏是窗口模式下才有效,而不是全屏模式。
    • @user2054758 您是否找到任何解决方案来为全屏应用程序创建叠加层?
    • 你必须使用一些基于OpenGL或directx的外部覆盖库。directdrawoverlaylib.codeplex.com
    猜你喜欢
    • 2016-12-10
    • 2012-03-07
    • 1970-01-01
    • 2017-02-07
    • 2012-09-23
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多