PyQT(также привязка C++ QT) встроенный терминал urxvt теряет фокус

У меня проблема с встраиванием терминала urxvt в приложение QT. Ниже приведен пример упрощенного кода. Когда я создаю окно QT и встраиваю терминал urxvt внутрь (используя параметр -embed), у меня возникает проблема с фокусом. Когда окно создано, первый щелчок в окне делает фокус на встроенном терминале -> все в порядке, но когда я нажимаю на окно во второй раз, терминал, кажется, теряет фокус, хотя нормальный ввод с клавиатуры и мыши все еще работает. Но сам терминал вроде бы думает, у него нет фокуса. Кажется, что события все еще отправляются в окно встраивания, хотя оно не имеет фокуса. Та же проблема возникает при использовании привязок C++ QT.

Это хорошо видно при добавлении настроек в.Xdefaults(и при запуске необходимого xrdb -load .Xdefaults): URxvt*fading: -40

Вот упрощенный пример:

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


class embterminal(QWidget): 

    def __init__(self):
        QWidget.__init__(self)
        self.setGeometry(1,1,600,400)
        self.process = QProcess(self)

        self.terminal = QX11EmbedContainer(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)

        self.terminal.showMaximized();

        self.process.start('urxvt',['-embed', str(self.terminal.winId())])

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = embterminal()
    main.show()
    sys.exit(app.exec_())`

1 ответ

Решение

Из документов для QX11EmbedContainer:

QX11EmbedContainer может встраивать виджеты XEmbed из наборов инструментов, отличных от Qt, таких как GTK+. Произвольные (не XEmbed) виджеты X11 также могут быть встроены, но специфичные для XEmbed функции, такие как активация окна и обработка фокуса, теряются.

Поэтому, возможно, urxvt (или ваша версия) не поддерживает все необходимые функции протокола XEmbed.

Поиск в сети нашел этот комментарий:

urxvt-embed почти работает. Он утверждает, что поддерживает его и все, но не отправляет XEMBED_REQUEST_FOCUS, когда вы нажимаете на него. Это означает, что нет способа вернуть фокус после того, как он потерян.

Другие вопросы по тегам