Создание прозрачного наложения с помощью qt

Недавно я изучал python, и теперь я хотел (попытаться) создать свое первое реальное приложение, проигрыватель субтитров для Linux. До сих пор я использовал проигрыватель субтитров Greenfish, который предназначен для пользователей Windows и не работает должным образом в Linux.

Я хотел создать приложение в qt, поскольку обнаружил, что прозрачные окна в tkinter невозможны, но, если кто-нибудь знает лучшую среду, пожалуйста, предложите!

Теперь, прежде чем начать, я в течение нескольких часов исследовал сеть, чтобы выяснить, как заставить мое приложение показывать поверх полноэкранного флэш-видео, и кажется, что это невозможно. Однако вышеупомянутому проигрывателю субтитров GF удается сделать это в Windows, но не в Linux(возможно, это также потому, что он работает через Wine).

Итак, мой вопрос: возможно ли создать прозрачное приложение, которое остается поверх полноэкранного флеш-видео, и если да, можете ли вы указать мне правильное направление?

Заранее спасибо.

редактировать: вот пример кода, который я пытался. Окно, созданное этим фрагментом кода, не остается над полноэкранным видео

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

1 ответ

Решение

Приведенный ниже пример кода создаст центрированное безрамное окно, которое должно оставаться поверх всех других окон в 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_()

Обновление для 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_()
Другие вопросы по тегам