LINUX.ORG.RU

Как держать картинку поверх всех программ и окон?

 


0

1

Всем привет. Собственно зашел в тупик, прошу помощи. Хочу постоянно держать маленькую картинку поверх вообще всего. Кроме питона ничего не знаю, поэтому набросал вот такой скриптик:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
__author__ = 'evgeny'

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *


if __name__ == '__main__':
    app = QApplication(sys.argv)

    class trayApp(QSystemTrayIcon):
        def __init__(self,  parent=None):
            QSystemTrayIcon.__init__(self,  parent)

            self.splash = QSplashScreen(QPixmap('x.png'), Qt.WindowStaysOnTopHint)
            self.splash.show()

            # Таймер добавил для циклического поднятия наверх
            self.timer = QTimer()
            self.connect(self.timer, SIGNAL('timeout()'), self.raising)
            self.timer.start(1000)

            self.quitAction = QAction(self.tr('&Exit'), self)
            self.connect(self.quitAction, SIGNAL('triggered()'), app, SLOT('quit()'))

            self.trayMenu = QMenu()
            self.trayMenu.addAction(self.quitAction)
            self.trayIconImage = QIcon('x.png')
            self.setIcon(self.trayIconImage)
            self.setContextMenu(self.trayMenu)

            self.show()

        def raising(self):
            self.splash.raise_() # не помогает
            print('Raised!')

    main = trayApp()
    sys.exit(app.exec_())
Однако флаг Qt.WindowStaysOnTopHint не даёт нужного эффекта: при выборе любого окна картинка уходит на задний план. Как я понял из документации
Some X11 window managers do not support the "stays on top" flag. A solution is to set up a timer that periodically calls raise_() on the splash screen to simulate the "stays on top" effect.
проблема в иксах, поэтому добавил предлагаемую фичу. Тем не менее это не даёт результата.

Может быть я вообще не туда копаю, и есть решение проще?

★★

OverrideRedirect? Будет поверх всего вообще и всегда. В Qt ставится флажком BypassWindowManagerH.int

anonymous
()
Ответ на: комментарий от anonymous

Вы о флаге Qt.X11BypassWindowManagerHint? Он также не помогает поднять над всем.

rmu ★★
() автор топика

С помощью Tkinter что-то вывести поверх всего - проще простого, но там нет трея и нормальной прозрачности (нет частичной прозрачности элементов).

rmu ★★
() автор топика

Опытным путем нашел, что если сформировать картинку без флагов

self.setPixmap(QPixmap('x.png'))
а затем установить флаги так:
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.X11BypassWindowManagerHint)
то картинка устойчиво висит поверх любых окон, игр и т. д.

Благодарю за участие. Решено.

rmu ★★
() автор топика
Ответ на: комментарий от rmu

только тебе еще надо клавиатуру заблочить,а то альаб в консольку и килл твоего г-на никто не отменял...но это следущий шаг я так понимаю

ждем темы на лоре «как отобрать весь ввод с клавиатуры в иксах»

f[f[f[f[f[f

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.