问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现PyQt5与QML响应彼此发送的信号

发布网友 发布时间:2022-05-10 06:37

我来回答

2个回答

懂视网 时间:2022-05-10 10:58

这篇文章主要为大家详细介绍了PyQt5每天必学之事件与信号的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这一部分我们将探索 PyQt5 的事件和信号是如何在应用程序中实现的。

Events事件

所有的GUI应用程序都是事件驱动的。应用程序事件主要产生自用户,但它们也可通过其他方法来产生,例如一个互联网连接,一个窗口管理器,或计时器。当我们调用应用程序的exec_()方法,应用程序进入主循环。主循环检测各种事件,并把它们发送到事件对象。

在事件模型中,有三个参与者:

  • event source(事件源)

  • event object(事件对象)

  • event target(事件目标)

  • 事件源是对象的状态改变而产生事件。事件对象(事件)是封装在事件源中状态变化的对象。事件目标是希望被通知的对象。事件源对象代表处理一个事件到事件目标的任务。

    PyQt5使用独特的信号和槽机制来处理事件。信号和槽用于对象之间的通信,当一个特定的事件发生时,信号被发射。槽可以是任意的Python调用。信号发射时连接到槽被调用。

    Signals & slots信号和槽

    这是一个简单的例子演示PyQt5的信号和槽。


    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    PyQt5 教程
    
    这个例子中,我们将QSlider的滑动信号连接到QLCDNumber中。
    
    作者:我的世界你曾经来过
    博客:http://blog.csdn.net/weiaitaowang
    最后编辑:2016年8月1日
    """
    
    import sys
    from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, 
    QLCDNumber, QVBoxLayout)
    from PyQt5.QtCore import Qt
    
    class Example(QWidget):
    
     def __init__(self):
     super().__init__()
    
     self.initUI()
    
     def initUI(self):
    
     lcd = QLCDNumber(self)
     sld = QSlider(Qt.Horizontal, self)
    
     vbox = QVBoxLayout()
     vbox.addWidget(lcd)
     vbox.addWidget(sld)
    
     self.setLayout(vbox)
     sld.valueChanged.connect(lcd.display)
    
     self.setGeometry(300, 300, 250, 150)
     self.setWindowTitle('信号/槽') 
     self.show()
    
    if __name__ == '__main__':
    
     app = QApplication(sys.argv)
     ex = Example()
     sys.exit(app.exec_())


    在我们的例子中,将用到QtGui.QLCDNumber和QtGui.QSlider。我们通过拖动滑块改变LCD数字。


    sld.valueChanged.connect(lcd.display)


    在这里,滑块的 valueChanged 信号连接到 lcd 的显示(display)槽。

    发送器是对象发送信号。接收器是接收信号的对象。槽的是反馈给信号的方法。

    程序执行后

    这里写图片描述

    覆写系统事件处理程序

    事件在PyQt5中的处理往往通过重写事件来处理程序。


    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    PyQt5 教程
    
    在这个例子中,我们执行事件处理程序。
    
    作者:我的世界你曾经来过
    博客:http://blog.csdn.net/weiaitaowang
    最后编辑:2016年8月1日
    """
    
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    from PyQt5.QtCore import Qt
    
    class Example(QWidget):
    
     def __init__(self):
     super().__init__()
    
     self.initUI()
    
     def initUI(self):
    
     self.setGeometry(300, 300, 250, 150)
     self.setWindowTitle('事件处理') 
     self.show()
    
     def keyPressEvent(self, e):
     if e.key() == Qt.Key_Escape:
     self.close()
    
    if __name__ == '__main__':
    
     app = QApplication(sys.argv)
     ex = Example()
     sys.exit(app.exec_())


    在我们的例子中,我们重新实现 keyPressEvent() 事件处理程序。


    def keyPressEvent(self, e):
     if e.key() == Qt.Key_Escape:
     self.close()


    如果我们按下键盘上的 Esc 键,应用程序终止。

    Event sender事件发送

    为了方便区分多个连接到同一事件目标的事件源,在PyQt5中可以使用sender()方法。


    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    PyQt5 教程
    
    在这个例子中,我们确定事件发送对象。
    
    作者:我的世界你曾经来过
    博客:http://blog.csdn.net/weiaitaowang
    最后编辑:2016年8月1日
    """
    
    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
    
    class Example(QMainWindow):
    
     def __init__(self):
     super().__init__()
    
     self.initUI()
    
     def initUI(self):
    
     btn1 = QPushButton('按钮一', self)
     btn1.move(30, 50)
    
     btn2 = QPushButton('按钮二', self)
     btn2.move(150, 50)
    
     btn1.clicked.connect(self.buttonClicked)
     btn2.clicked.connect(self.buttonClicked)
    
     self.statusBar()
    
     self.setGeometry(300, 300, 300, 150)
     self.setWindowTitle('事件发送') 
     self.show()
    
     def buttonClicked(self):
    
     sender = self.sender()
     self.statusBar().showMessage(sender.text() + ' 被按下')
    
    if __name__ == '__main__':
    
     app = QApplication(sys.argv)
     ex = Example()
     sys.exit(app.exec_())


    在我们的例子中有两个按钮。两个按钮都连接 buttonClicked() 方法,我们通过调用 sender() 方法响应单击的按钮。


    btn1.clicked.connect(self.buttonClicked)
    btn2.clicked.connect(self.buttonClicked)


    两个按钮连接到同一个槽。


    def buttonClicked(self):
    
     sender = self.sender()
     self.statusBar().showMessage(sender.text() + ' 被按下')


    我们通过调用 sender() 方法确定信号源。在应用程序的状态栏,显示被按下按钮的标签。

    程序执行后

    这里写图片描述

    定制发射信号

    从一个QObject 创建的对象可以发出信号。在下面的例子中,我们将看看我们如何能够定制发出信号。


    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    PyQt5 教程
    
    在这个例子中,我们显示了如何以发射信号。
    
    作者:我的世界你曾经来过
    博客:http://blog.csdn.net/weiaitaowang
    最后编辑:2016年8月1日
    """
    
    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow
    from PyQt5.QtCore import pyqtSignal, QObject
    
    class Communicate(QObject):
     closeApp = pyqtSignal()
    
    class Example(QMainWindow):
    
     def __init__(self):
     super().__init__()
    
     self.initUI()
    
     def initUI(self):
    
     self.c = Communicate()
     self.c.closeApp.connect(self.close)
    
     self.setGeometry(300, 300, 300, 150)
     self.setWindowTitle('发射信号') 
     self.show()
    
     def mousePressEvent(self, event):
    
     self.c.closeApp.emit()
    
    if __name__ == '__main__':
    
     app = QApplication(sys.argv)
     ex = Example()
     sys.exit(app.exec_())


    我们创建一个名为closeApp新的信号。这个信号是发射按下鼠标事件。该信号被连接到QMainWindow中的close()槽。


    class Communicate(QObject):
     closeApp = pyqtSignal()


    创建继承自 QObject 的 Communicate 类,该类中有一个 pyqtSignal() 类的属性。


    self.c = Communicate()
    self.c.closeApp.connect(self.close)


    将我们自定义的 closeApp 信号连接到QMainWindow中的close()槽。


    def mousePressEvent(self, event):
     self.c.closeApp.emit()


    当我们鼠标在程序窗口出现点击动作时,closeApp信号被发射(emit)。应用程序终止。

    热心网友 时间:2022-05-10 08:06

    qml和cpp中的类没有建立关联的话就不会响应信号 QDeclarativeView login; login.rootContext()->setContextProperty("ycmainui",YcMainUi::YcMain()); (YcMainUi::YcMain() cpp中类的单实例) qml中: Connections{ target: ycmainui onTo_update。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    弱弱的问一句R9 270X显卡怎么样~ 能带得起我的AMD 240CPU么?_百度知 ... i54570cpu华硕z87a主板要配多少的内存条和显卡 i5 3570k配R9 270X显卡,用什么主板和电源? 很容易上火是什么原因 口干舌燥五心烦热失眠多梦夜不能寐请问是什么原因,吃什么能有效... 想问看大家对老妻少夫的问题有何看法? ...战记第十三章第6关打法 山海战记13-6攻略-手游攻略-游戏鸟手游网 ...战记第十七章第1关打法 山海战记17-1攻略-手游攻略-游戏鸟手游网 ...山海战记9-6图文攻略-手游攻略-游戏鸟手游网 ...战记第十二章第2关打法 山海战记12-2攻略-手游攻略-游戏鸟手游网 目前都有哪些3D打印机是使用激光器进行工作的 光固化3D打印机的激光功率过低怎么办? 3d打印是怎么回事? 3D打印所用的激光头和一般的激光加工的激光头一样么 炖燕窝可以加蜂蜜吗? 燕窝和蜂蜜同吃,会相克吗 牛奶加燕麦加燕窝加蜂蜜可以一起吃吗?能减肥吗? 华为呼叫限制登录密码 如何在vs中查找实现接口的类,快键方式? vs中的一个快捷键 vs 查找与替换 vs2010怎么快速查找变量或方法 如何预先存储一段代码在vs2013中然后用快捷键调用处理 华为需要多基因融合突变防止内卷,员工内卷说明了企业有哪些问题? 派派账号不能进游戏,怎么注销号? 科技论文中作者简介部分怎么与文章内容分开,也就是上面的横线是怎么加的,谢谢大侠 请问论文上面这一横条是什么,怎么加上去的​ 发票报销是什么 请问报销是什么意思 什么叫报销,说简单一点,我理解能力不好 秦始皇陵兵马俑工程延续多久? 秦国兵马俑是多少工匠花了多久时间打造的奇观? 兵马俑修建用了多长的时间 DNF韩服无言建设者是不是可以升级海伯伦了?需要什么材料?要多少 dnf除了90b还有什么装备能升级95 南宁经济适用住房公积金贷款材料 微博里发信息系统提示账号处于锁定状态什么原因 新浪微博 说账号处于锁定状态 什么意思 元朝中央官制叫什么 元朝的中央官制有什么特点? 元朝中央官制度是什么 元、明两朝中央和地方机构的设置各有何不同? 元朝中书省的职能是什么? 元代的*官制设中书省代替前三代三省,在地方行政上设中书省和行省。这两个中书省有何区别? 元朝的中央官制是一省制么 元代中央官制的中书省 用什么胶水来粘接亚克力(pmma)比较好? pyqt5信号槽的连接类型 如何把照片拍的更清晰 有谁知道有湖南卫视的播放器?