精华内容
下载资源
问答
  • 信号与槽函数的关联二、自定义槽函数总结 前言 在上一章我们已经讲解了如何使用Qt生成的py文件模板,但是这还仅仅只能实现图形界面部分,对于整个GUI的逻辑处理和函数响应都没有涉及,这里就和MATLAB中每个控件的...


    前言

    在上一章我们已经讲解了如何使用Qt生成的py文件模板,但是这还仅仅只能实现图形界面部分,对于整个GUI的逻辑处理和函数响应都没有涉及,这里就和MATLAB中每个控件的callback和其他响应函数一样。Qt的函数响应分为信号和槽函数,信号就是用户的动作,槽函数就是相应的响应。


    一、内置信号和槽函数

    1.新建项目

    我们首先来创建一个项目,与之前不一样,这里我们需要还要创建相应的c++文件,并不需要我们编辑,只是用于查看一些信息。
    在这里插入图片描述
    一路选下去。
    在这里插入图片描述
    在这里插入图片描述
    打开新建的ui文件:
    在这里插入图片描述
    设计好界面:
    在这里插入图片描述

    2.信号与槽函数的关联

    在这里插入图片描述
    左键长按 确认pushbutton拖动到界面外:
    在这里插入图片描述
    在这里插入图片描述
    这里是使点击确认按键关闭dialog窗口,下面还是使用pyuic5 -o Proj2_dialog.py dialog.ui 生成py文件,文件名需要改成自己的,打开py文件:

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'dialog.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.4
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(342, 240)
            self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog)
            self.plainTextEdit.setGeometry(QtCore.QRect(9, 59, 281, 138))
            font = QtGui.QFont()
            font.setPointSize(20)
            font.setBold(True)
            font.setWeight(75)
            self.plainTextEdit.setFont(font)
            self.plainTextEdit.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
            self.plainTextEdit.setCenterOnScroll(False)
            self.plainTextEdit.setObjectName("plainTextEdit")
            self.horizontalLayoutWidget = QtWidgets.QWidget(Dialog)
            self.horizontalLayoutWidget.setGeometry(QtCore.QRect(80, 30, 240, 21))
            self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
            self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
            self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.radioButton_3 = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
            self.radioButton_3.setObjectName("radioButton_3")
            self.horizontalLayout.addWidget(self.radioButton_3)
            self.radioButton_2 = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
            self.radioButton_2.setObjectName("radioButton_2")
            self.horizontalLayout.addWidget(self.radioButton_2)
            self.radioButton = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
            self.radioButton.setObjectName("radioButton")
            self.horizontalLayout.addWidget(self.radioButton)
            self.horizontalLayoutWidget_3 = QtWidgets.QWidget(Dialog)
            self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(9, 203, 311, 30))
            self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3")
            self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3)
            self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout_3.setSpacing(30)
            self.horizontalLayout_3.setObjectName("horizontalLayout_3")
            self.pushButton_3 = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
            self.pushButton_3.setObjectName("pushButton_3")
            self.horizontalLayout_3.addWidget(self.pushButton_3)
            self.pushButton_2 = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
            self.pushButton_2.setObjectName("pushButton_2")
            self.horizontalLayout_3.addWidget(self.pushButton_2)
            self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
            self.pushButton.setObjectName("pushButton")
            self.horizontalLayout_3.addWidget(self.pushButton)
            self.label = QtWidgets.QLabel(Dialog)
            self.label.setGeometry(QtCore.QRect(20, 10, 54, 20))
            self.label.setObjectName("label")
            self.horizontalLayoutWidget_2 = QtWidgets.QWidget(Dialog)
            self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(80, 10, 240, 21))
            self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
            self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.checkBox_3 = QtWidgets.QCheckBox(self.horizontalLayoutWidget_2)
            self.checkBox_3.setObjectName("checkBox_3")
            self.horizontalLayout_2.addWidget(self.checkBox_3)
            self.checkBox_2 = QtWidgets.QCheckBox(self.horizontalLayoutWidget_2)
            self.checkBox_2.setObjectName("checkBox_2")
            self.horizontalLayout_2.addWidget(self.checkBox_2)
            self.checkBox = QtWidgets.QCheckBox(self.horizontalLayoutWidget_2)
            self.checkBox.setObjectName("checkBox")
            self.horizontalLayout_2.addWidget(self.checkBox)
            self.label_2 = QtWidgets.QLabel(Dialog)
            self.label_2.setGeometry(QtCore.QRect(20, 30, 54, 16))
            self.label_2.setObjectName("label_2")
    # 槽函数的关联在此处
            self.retranslateUi(Dialog)
            self.pushButton_2.clicked.connect(Dialog.accept) # 这里是确认
            self.pushButton.clicked.connect(Dialog.close)   # 这里是取消
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
        def retranslateUi(self, Dialog):
            _translate = QtCore.QCoreApplication.translate
            Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
            self.plainTextEdit.setPlainText(_translate("Dialog", "Hello World!"))
            self.radioButton_3.setText(_translate("Dialog", "Black    "))
            self.radioButton_2.setText(_translate("Dialog", "Red   "))
            self.radioButton.setText(_translate("Dialog", "Blue"))
            self.pushButton_3.setText(_translate("Dialog", "清空"))
            self.pushButton_2.setText(_translate("Dialog", "确认"))
            self.pushButton.setText(_translate("Dialog", "取消"))
            self.label.setText(_translate("Dialog", "字体样式"))
            self.checkBox_3.setText(_translate("Dialog", "Underline"))
            self.checkBox_2.setText(_translate("Dialog", "Italic"))
            self.checkBox.setText(_translate("Dialog", "Bold"))
            self.label_2.setText(_translate("Dialog", "字体颜色"))
    
    
    

    按照之前的单继承方法,我们另写一个文件来测试:

    import  sys
    from PyQt5.QtWidgets import QApplication, QDialog
    from Proj2_dialog import Ui_Dialog
    
    class QmyDialog(QDialog):
        def __init__(self):
            super(QmyDialog, self).__init__()
            self.ui = Ui_Dialog()
            self.ui.setupUi(self)
     #   def on_pushButton_3_clicked(self): 这两句不用
      #      self.ui.plainTextEdit.clear()
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        MyDialog = QmyDialog()
        MyDialog.show()
        sys.exit(app.exec_())
    

    在这里插入图片描述
    这时单击确认和取消按键就可以关闭窗口了。

    二、自定义槽函数

    假设现在我们想点击清空按键的时候将文本编辑器中的文本全部清除,这就需要自己定义dialog的相关槽函数了。
    在这里插入图片描述
    右击清空button,选择转到槽函数:
    在这里插入图片描述
    这是它作为一个pushbutton所拥有的信号,点击OK,会自动跳转到一个c++文件中,这就是关联的槽函数的名称,我们把它复制到自己定义的类中作为一个类方法:
    在这里插入图片描述

    import  sys
    from PyQt5.QtWidgets import QApplication, QDialog
    from Proj2_dialog import Ui_Dialog
    
    class QmyDialog(QDialog):
        def __init__(self):
            super(QmyDialog, self).__init__()
            self.ui = Ui_Dialog()
            self.ui.setupUi(self)
        def on_pushButton_3_clicked(self): # 这就是自己定义的槽函数
           self.ui.plainTextEdit.clear()
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        MyDialog = QmyDialog()
        MyDialog.show()
        sys.exit(app.exec_())
    

    运行,单击清空按键就会发现文本被清除了,完美!
    在这里插入图片描述

    总结

    这里我们生成的c++文件其实没用用上,只是为了查看生成的槽函数的名称,其实我们自己也省略了手动关联的部分,比如相对于内置的槽函数,我们自定义的槽函数少了下面的语句:

            self.pushButton_2.clicked.connect(Dialog.accept) # 这里是确认
            self.pushButton.clicked.connect(Dialog.close)   # 这里是取消
    

    这是因为Qt帮我们自动关联了,只要我们命名的槽函数符合某个规范,例如:on_pushButton_3_clicked(self):,命名规则符合on_<object name>_<signal name>_(<signal parameter>)即可,我们注意到上面自动生成的py文件还包含一句:

            self.pushButton_2.clicked.connect(Dialog.accept) # 这里是确认
            self.pushButton.clicked.connect(Dialog.close)   # 这里是取消
            QtCore.QMetaObject.connectSlotsByName(Dialog)  # 这里是自动建立关联
    

    如果没有后面这句代码,那么我们也要向上面一样手动关联:

    self.pushButton_3.clicked.connect(Dialog.on_pushButton_3_clicked)
    
    展开全文
  • 信号与槽函数有以下几个特点: 一个信号可以关联多个槽函数。 一个信号可以关联其他信号信号的参数可以是任何Python数据类型。 一个槽函数可以和多个信号关联。 关联可以是同步也可以是异步的。 可以在不同线程...


    前言

    信号与槽函数有以下几个特点:

    1. 一个信号可以关联多个槽函数。
    2. 一个信号可以关联其他信号。
    3. 信号的参数可以是任何Python数据类型。
    4. 一个槽函数可以和多个信号关联。
    5. 关联可以是同步也可以是异步的。
    6. 可以在不同线程之间建立关联。

    上一章讲了一般内置信号和内置槽函数的关联使用,本章将介绍一些特殊情况以及,自定义信号和槽函数的使用。

    一、重载overload信号的关联

    名称相同但是参数个数或者类型不同的信号称为重载overload信号,这里我们可以看到之前选择信号时的图片:
    在这里插入图片描述
    这两个clicked信号的触发条件都一样,但是一个有返回参数,即如果使用clicked(bool),关联的槽函数会得到一个bool类型的输入参数。那么,这两个信号应该怎么使用呢?我们以上一章的代码为例:

    如果我们采用的是不带参数的clicked方法,那么通过下面这条语句可以实现自动关联符合命名规则的槽函数。

     QtCore.QMetaObject.connectSlotsByName(Dialog)
         def on_pushButton_3_clicked(self): 
      		   self.ui.plainTextEdit.clear()
    
    

    如果我们采用的是clicked(bool)信号,即便我们的槽函数命名符合规则,也不会自动关联,反而可能抛出异常退出程序。因为当出现具有相同名称的信号时,默认关联的是不带参数的信号,而槽函数定义的时候指定了输入参数,会导致输入参数不够而出错。

     QtCore.QMetaObject.connectSlotsByName(Dialog)
         def on_pushButton_3_clicked(self,checked): 
         	   print(checked)
      		   self.ui.plainTextEdit.clear()
    

    上述代码应该修改为:

        @pyqtSlot(bool)  # 修饰器  告诉python 信号有boo类型输入参数l
        def on_checkBox_clicked(self,checked):
            print(checked)
    

    不过要记得引入相关的库:

    from PyQt5.QtCore import Qt,pyqtSlot
    

    完整代码:

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'dialog.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.4
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    # 文件保存为Proj2_dialog.py
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(360, 240)
            self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog)
            self.plainTextEdit.setGeometry(QtCore.QRect(9, 59, 281, 138))
            font = QtGui.QFont()
            font.setPointSize(20)
            font.setBold(True)
            font.setWeight(75)
            self.plainTextEdit.setFont(font)
            self.plainTextEdit.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
            self.plainTextEdit.setCenterOnScroll(False)
            self.plainTextEdit.setObjectName("plainTextEdit")
            self.horizontalLayoutWidget = QtWidgets.QWidget(Dialog)
            self.horizontalLayoutWidget.setGeometry(QtCore.QRect(100, 30, 240, 21))
            self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
            self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
            self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.radioButton_3 = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
            self.radioButton_3.setObjectName("radioButton_3")
            self.horizontalLayout.addWidget(self.radioButton_3)
            self.radioButton_2 = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
            self.radioButton_2.setObjectName("radioButton_2")
            self.horizontalLayout.addWidget(self.radioButton_2)
            self.radioButton = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
            self.radioButton.setObjectName("radioButton")
            self.horizontalLayout.addWidget(self.radioButton)
            self.horizontalLayoutWidget_3 = QtWidgets.QWidget(Dialog)
            self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(9, 203, 311, 30))
            self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3")
            self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_3)
            self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout_3.setSpacing(30)
            self.horizontalLayout_3.setObjectName("horizontalLayout_3")
            self.pushButton_3 = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
            self.pushButton_3.setObjectName("pushButton_3")
            self.horizontalLayout_3.addWidget(self.pushButton_3)
            self.pushButton_2 = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
            self.pushButton_2.setObjectName("pushButton_2")
            self.horizontalLayout_3.addWidget(self.pushButton_2)
            self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget_3)
            self.pushButton.setObjectName("pushButton")
            self.horizontalLayout_3.addWidget(self.pushButton)
            self.label = QtWidgets.QLabel(Dialog)
            self.label.setGeometry(QtCore.QRect(20, 10, 81, 20))
            self.label.setObjectName("label")
            self.horizontalLayoutWidget_2 = QtWidgets.QWidget(Dialog)
            self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(100, 10, 240, 21))
            self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
            self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.checkBox_3 = QtWidgets.QCheckBox(self.horizontalLayoutWidget_2)
            self.checkBox_3.setObjectName("checkBox_3")
            self.horizontalLayout_2.addWidget(self.checkBox_3)
            self.checkBox_2 = QtWidgets.QCheckBox(self.horizontalLayoutWidget_2)
            self.checkBox_2.setObjectName("checkBox_2")
            self.horizontalLayout_2.addWidget(self.checkBox_2)
            self.checkBox = QtWidgets.QCheckBox(self.horizontalLayoutWidget_2)
            self.checkBox.setObjectName("checkBox")
            self.horizontalLayout_2.addWidget(self.checkBox)
            self.label_2 = QtWidgets.QLabel(Dialog)
            self.label_2.setGeometry(QtCore.QRect(20, 30, 81, 16))
            self.label_2.setObjectName("label_2")
    
            self.retranslateUi(Dialog)
            self.pushButton_2.clicked.connect(Dialog.accept)
            self.pushButton.clicked.connect(Dialog.close)
            # self.checkBox.clicked[bool].connect(Dialog.checkBox_clicked)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
        def retranslateUi(self, Dialog):
            _translate = QtCore.QCoreApplication.translate
            Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
            self.plainTextEdit.setPlainText(_translate("Dialog", "Hello World!"))
            self.radioButton_3.setText(_translate("Dialog", "Black    "))
            self.radioButton_2.setText(_translate("Dialog", "Red   "))
            self.radioButton.setText(_translate("Dialog", "Blue"))
            self.pushButton_3.setText(_translate("Dialog", "清空"))
            self.pushButton_2.setText(_translate("Dialog", "确认"))
            self.pushButton.setText(_translate("Dialog", "取消"))
            self.label.setText(_translate("Dialog", "字体样式"))
            self.checkBox_3.setText(_translate("Dialog", "Underline"))
            self.checkBox_2.setText(_translate("Dialog", "Italic"))
            self.checkBox.setText(_translate("Dialog", "Bold"))
            self.label_2.setText(_translate("Dialog", "字体颜色"))
    
    
    # 新建另一个py文件,名字随意
    import sys
    from PyQt5.QtWidgets import QDialog,QApplication
    from Proj2_dialog import Ui_Dialog
    from PyQt5.QtCore import Qt,pyqtSlot
    
    class QmyDialog(QDialog):
        def __init__(self):
            super().__init__()
            self.ui = Ui_Dialog()
            self.ui.setupUi(self)
        def on_pushButton_3_clicked(self):
            self.ui.plainTextEdit.clear()
        def on_checkBox_3_toggled(self,checked):
            font = self.ui.plainTextEdit.font()
            # print(type(font))
            font.setUnderline(checked)
            self.ui.plainTextEdit.setFont(font)
        def on_checkBox_2_toggled(self,checked):
            font = self.ui.plainTextEdit.font()
            # print(type(font))
            font.setItalic(checked)
            self.ui.plainTextEdit.setFont(font)
        def on_checkBox_toggled(self,checked):
            font = self.ui.plainTextEdit.font()
            # print(type(font))
            font.setBold(checked)
            self.ui.plainTextEdit.setFont(font)
    
        @pyqtSlot(bool)
        def on_checkBox_clicked(self,checked):
            print(checked)
    
    
    
    if __name__ =="__main__":
        app = QApplication(sys.argv)
        mydialog = QmyDialog()
        mydialog.show()
        sys.exit(app.exec_())
    
    

    运行结果:
    在这里插入图片描述

    二、自定义信号

    自定义信号分为无输入参数,单个输入参数,多个输入参数以及同名但是输入参数类型可变的重载overload信号。

    自建信号必须是QObject的子类的属性,PyQt5.QtCore.pyqtSignal()能够为类建立信号。
    代码如下(示例):

    import sys
    from PyQt5.QtCore import QObject,pyqtSlot,pyqtSignal
    
    class Human(QObject): # 继承QObject,也可以是QObject的子类,比如说QWidget
        onePar_overload = pyqtSignal([int],[str])# 单个输入变量,int类型或者str类型
        twoPar_overload = pyqtSignal([int,int],[int,str])# 两个输入变量
        def onePar(self,int):
            print('onepar')
        def onePar_str(self,str1):
            print('onepar_str')
        def twopar(self,int1,int2):
            print(int1,int2)
        def twopar_str(self,int1,str2):
            print(int1,str2)
    
    a = Human()
    a.onePar_overload.connect(a.onePar)
    a.onePar_overload.emit(1)# 发出信号,默认参数类型是第一个,也就是[int]
    a.onePar_overload[str].connect(a.onePar_str)
    a.onePar_overload[str].emit("123")# 发出信号,要指定发送信号类型是[str]
    a.twoPar_overload.connect(a.twopar)
    a.twoPar_overload.emit(1,2)
    a.twoPar_overload[int,str].connect(a.twopar_str)
    a.twoPar_overload[int,str].emit(1,'132')
    # 需要注意的是,这里都需要手动关联,并且槽函数是不能重名的,即使发送信号是同一个信号
    # 还是仔细体会代码吧
    

    效果:
    在这里插入图片描述

    总结

    我无数次希望把文章写得面面俱到,每个注意的小点都写清楚,但是我做不到,怪我太懒。文章啰里啰嗦就很烦,真的很佩服那些写教程写得清晰易懂的人,有问题还是留言问吧。

    展开全文
  • 绑定信号与槽函数????1. 关于信号与槽????2. 信号与槽在QtDesigner的应用2.1 砍掉上节遗留的小尾巴:重新命名控件2.2 编辑信号/槽2.3 运行槽函数 ????1. 关于信号与信号与槽(Signal & Slot)是 Qt 编程的...

    🙈1. 关于信号与槽

    1. 信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。
    2. 信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。
    3. 槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

    🙈2. 信号与槽在QtDesigner的应用

    2.1 砍掉上节遗留的小尾巴:重新命名控件

    1. 上节中,我们创建了窗口工具的主界面,为了让后面的代码清晰,我们需要先把创建的控件进行重命名。各个控件的名称在右侧“对象查看器”可以看到,选中界面的某个控件,右侧对应的控件就会被选中,双击后就可以命名。当前的命名情况如图:
      在这里插入图片描述

    2. 为了方便后面代码的开发,我们需要定下命名规则。以下是我的命名,各位可以按照自己的喜好命名,简洁易懂即可:
      Group Box:

      1. 串口设置:com_setting
      2. 接收设置:receive_setting
      3. 发送设置:send_setting
      4. 发送按钮:send
      5. 接收框:receiver
      6. 发送框:sender
        在这里插入图片描述
    3. 接下来,我们打开com_setting,对里面具体的控件进行命名:
      在这里插入图片描述

    4. 打开receive_setting和send_setting标签,对里面的控件重命名:
      在这里插入图片描述

    5. 其他控件的命名如下:
      在这里插入图片描述

    2.2 编辑信号/槽

    1. 点击如图所示的图标,进入“编辑信号/槽”:
      在这里插入图片描述
    2. 左键单击“发送”按钮,不松并拖曳出一个类似“接地”的图标后松开鼠标:
      在这里插入图片描述
    3. 弹出对话框,我们单击左侧“clicked”,再单击右侧下方“编辑”按钮添加槽函数。该操作的目的是:当我们“clicked”这个按钮后,会执行右侧绑定的槽函数。当前我们没有添加槽函数,所以右侧槽函数列表是空的。

    在这里插入图片描述

    1. 单击绿色的“+”按钮,添加一个名为“send_info”的函数,点击“OK”:
      在这里插入图片描述
    2. 回到刚刚对话框,这时左面会出现我们刚刚新建的“send_info”的函数,同时选中左右两边的“clicked”和“send_info”,点击OK:
      在这里插入图片描述
    3. 这时可以看到按钮处会多了“clicked”和“send_info”两个方框,表明绑定成功,点击保存。
      在这里插入图片描述

    2.3 运行槽函数

    1. 回到PyCharm,选中Main.ui后进行编译:
      在这里插入图片描述
    2. 回到SPT.py,dubug一下,这时会看到console报错:
      在这里插入图片描述
    3. 这表明在SPT.py中没有我们刚刚在QtDesigner中绑定的“send_info”函数,我们在SPT.py的Win_Main类中,增加“send_info”函数:
    import sys
    from PyQt5.QtWidgets import QMainWindow, QApplication
    import Main
    
    
    class Win_Main(QMainWindow):
        def __init__(self, parent=None):
            super(Win_Main, self).__init__(parent)
            self.ui = Main.Ui_MainWindow()
            self.ui.setupUi(self)
            
        # 该处增加send_info函数:
        def send_info(self):
            print("点击了发送按钮")
    
    if __name__== "__main__":
        app = QApplication(sys.argv)
    
        # 界面实例化
        Win_Main = Win_Main()
    
        # 界面显示
        Win_Main.show()
    
        sys.exit(app.exec_())
    
    1. 此时点击“发送”按钮,console中会出现“点击了发送按钮”,表明函数绑定成功。
      在这里插入图片描述
    2. 其他的控件绑定的方法与此方法大同小异,区别在于不同控件有不同的出发槽函数方式,如QcomboBox具有如下触发方式,常用的是currentTextChange,其他方式小伙伴可以查一下:
      在这里插入图片描述
    展开全文
  • python信号与槽(一)

    千次阅读 2020-03-01 10:32:49
    最近在弄毕设,要用到信号与槽,简单...槽函数的声明要与信号变量相一致 举个栗子: from PyQt5.QtCore import * #定义信号相关 class MyTypeSignal(QObject): #定义一个信号变量,1个参数 sendmag=pyqtSign...

    最近在弄毕设,要用到信号与槽,简单学习了一下。

    信号与槽内容有四块:1.信号变量。2.发射函数。3.接收函数(也就是槽)。4.连接信号与槽

    槽函数的声明要与信号变量相一致

    举个栗子:

    from PyQt5.QtCore import *
    #定义信号相关
    class MyTypeSignal(QObject):
        #定义一个信号变量,1个参数
        sendmag=pyqtSignal(object)
        #发射函数
        def run(self):
            self.sendmag.emit('Hello')
    #定义槽
    class MySlot(QObject):
        #定义槽函数,参数msg用来表示信号变量的值
        def get(self,msg):
            print("信息"+msg)
    
    #主函数
    if __name__ == '__main__':
        send=MyTypeSignal()
        slot=MySlot()
        send.sendmag.connect(slot.get)#将信号变量与槽函数连接
        send.run()#运行发射函数,进行信号发射
    

    输出结果:

    样例很基础,但感觉比较实用。

    展开全文
  • python 信号与槽

    2020-05-31 15:41:56
    看看控件的信号有哪些? 然后 没参数的: self.actionAbout.triggered.connect(self.slotOpenAbout) 有参数的[] self.actionAbout.triggered['bool'].connect(self.slotOpenAbout) ...
  • python信号与槽(四)

    2020-03-01 17:01:32
    这个用到了线程,利用信号与槽,在2个线程之间相互传递数据。 #2个线程之间互相传递数据 from PyQt5.QtCore import * from PyQt5.QtWidgets import * import time import sys class BackendThread(QThread): ...
  • python信号与槽(二)

    2020-03-01 10:44:57
    上一篇信号与槽的连接,与信号发射都是手动的,而且信号传递比较单一,这次我们弄一些自动的。 from PyQt5.QtCore import * class MultiSignal(QObject): ##信号变量定义 #无参信号 signal1=pyqtSignal() # ...
  • 信号与槽介绍 信号(Signal)和槽...当信号发射时,连接的槽函数将会自动执行。通过object.signal.connect()方法连接。 PyQt的窗口控件类有很多内置的信号,开发者也可以添加自定义信号信号与槽的特点如下: ...
  • python信号与槽(三)

    2020-03-01 12:20:54
    前两篇都是在控制台进行显示,这篇构建一个UI界面进行显示 from PyQt5.QtCore import * from PyQt5.QtWidgets import * ... #定义一个无参信号 signal=pyqtSignal() def __init__(self): super().__in...
  • Python - PyQt中信号/槽函数的使用

    千次阅读 2019-01-15 10:44:51
    1、PyQt中信号的定义 from PyQt5.QtCore import Qt, pyqtSignal // 引入模块 class TestSignal(QWidget): # 创建自定义信号,只能定义成类变量# mySignal_1 = pyqtSignal() # 创建信号,用于发送按钮已点击...
  • 自学python,不同于工作上的代码编程,主要是为了好玩或者满足自己的需求。因此,我一直想自己做些APP,未来可以给小朋友做做练习,比如让她学习算术、学习成语接龙之类的。总不能让她看这样恐怖的界面吧? 因此...
  • 内置信号与槽函数 from PyQt5.QtWidgets import * import sys class Winform(QWidget): def __init__(self,parent=None): super().__init__(parent) self.setWindowTitle('内置的信号/槽示例') self.resize...
  • 信号与槽函数的自动绑定(三)

    千次阅读 2018-07-23 11:02:47
    在文章使用PyQt5制作界面(实现界面代码的分离)(二)中,实现了界面代码的分离,但是需要手工进行信号与槽函数的绑定,那么能不能实现信号和超函数的自动绑定呢? 答案当然是肯定的。 废话不说,直接上过程 ...
  • 列举了信号槽函数多种多样的构造和使用方法 https://www.cnblogs.com/gengyi/p/8661235.html 详细讲解了 多进程中共享内存 Value & Array https://blog.csdn.net/lechunluo3/article/details/79005910 ...
  • 目录传统语法: SIGNAL () 和 SLOT()新语法: Signal() and Slot()使用 QtCore.Signal()使用QtCore.Slot()示例基本示例添加参数添加重载槽函数重载和更复杂的信号连接和发射的示例发出信号的对象方法示例从另一个线程...
  • 所谓高级自定义信号与槽,指的就是我们可以以自己喜欢的方式定义信号与槽函数,并传递参数,自定义信号的一般流程如下 定义信号 定义槽函数 连接信号与槽函数 发射信号 1、定义信号 通过类成员变量定义信号对象 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,558
精华内容 1,823
关键字:

python信号与槽函数

python 订阅