Проблема с темой при попытке показать виджет - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь создать лаунчер (например, Альберт или Spotlight).Для этого мне нужно подключить ярлык к функции show () моего окна.Для этого я использую библиотеку клавиатура .

Вот где я нахожусь:

import sys
from PySide import QtGui
import keyboard


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Example')

def main():
    app = QtGui.QApplication(sys.argv)

    window = Example()
    keyboard.add_hotkey('ctrl+alt+9', window.show, args=[])

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Но при вызове ярлыка я получаю следующий Qtошибка:

QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread

Кто-нибудь имеет представление о том, что может вызвать это?

1 Ответ

0 голосов
/ 18 октября 2018

Сообщение указывает, что проблема в том, что обратный вызов вызывается из другого потока, и в Qt графический интерфейс не может быть обновлен из другого потока, возможное решение состоит в создании класса, который предоставляет сигнал, который подключается к шоу, и чтоСигнал выдается как обратный вызов.

import sys
import keyboard
from PySide import QtCore, QtGui


class SignalHelper(QtCore.QObject):
    signal = QtCore.Signal()


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Example')


def main():
    app = QtGui.QApplication(sys.argv)
    window = Example()
    helper = SignalHelper()
    helper.signal.connect(window.show)
    keyboard.add_hotkey('ctrl+alt+9', helper.signal.emit)
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Или для этих случаев лучше использовать QMetaObject::invokeMethod() с Qt::QueuedConnection, поскольку show() - это слот, как показано ниже:

import sys
import keyboard
from PySide import QtCore, QtGui


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Example')


def main():
    app = QtGui.QApplication(sys.argv)
    window = Example()
    keyboard.add_hotkey('ctrl+alt+9', 
        QtCore.QMetaObject.invokeMethod, 
        args=(window, "show", QtCore.Qt.QueuedConnection))
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
...