栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将自定义事件发送到PyQt中的事件循环

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将自定义事件发送到PyQt中的事件循环

在PyQt中,以下说明:

document.addEventListener('Hello', () => console.log('Got it'))

等价的

document.hello_signal.connect(lambda: print('Got it'))

以类似的方式:

document.dispatchEvent(new Event("Hello"))

等价的

document.hello_signal.emit()

但是最大的区别是“文档”对象的范围,因为连接是在全局元素之间。但是在PyQt中,该元素不存在。

模拟您指出的行为的一种方法是创建一个全局对象:

globalobject.py

from PyQt5 import QtCoreimport functools@functools.lru_cache()class GlobalObject(QtCore.QObject):    def __init__(self):        super().__init__()        self._events = {}    def addEventListener(self, name, func):        if name not in self._events: self._events[name] = [func]        else: self._events[name].append(func)    def dispatchEvent(self, name):        functions = self._events.get(name, [])        for func in functions: QtCore.QTimer.singleShot(0, func)

main.py

from PyQt5 import QtCore, QtWidgetsfrom globalobject import GlobalObjectclass MainWindow(QtWidgets.QMainWindow):    def __init__(self, parent=None):        super().__init__(parent)        button = QtWidgets.QPushButton(text="Press me", clicked=self.on_clicked)        self.setCentralWidget(button)    @QtCore.pyqtSlot()    def on_clicked(self):        GlobalObject().dispatchEvent("hello")class Widget(QtWidgets.QWidget):    def __init__(self, parent=None):        super().__init__(parent)        GlobalObject().addEventListener("hello", self.foo)        self._label = QtWidgets.QLabel()        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(self._label)    @QtCore.pyqtSlot()    def foo(self):        self._label.setText("foo")if __name__ == "__main__":    import sys    app = QtWidgets.QApplication(sys.argv)    w1 = MainWindow()    w2 = Widget()    w1.show()    w2.show()    sys.exit(app.exec_())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429258.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号