gpt4 book ai didi

python - 尝试显示小部件时出现线程问题

转载 作者:行者123 更新时间:2023-12-01 08:54:16 25 4
gpt4 key购买 nike

我正在尝试创建一个启动器(例如 Albert 或 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

有人知道可能导致这种情况的原因吗?

最佳答案

该消息表明问题是从另一个线程调用回调,并且在 Qt 中无法从另一个线程更新 GUI,一个可能的解决方案是创建一个提供连接到显示的信号的类,并且信号作为回调发出。

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

关于python - 尝试显示小部件时出现线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52880119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com