PyQt5中信号连接槽的方法

信号连接槽的方法有4种:

  1. 在创建 Widget 的时候使用信号作为关键字参数,其值为连接的槽函数名
  2. 使用信号的 connect() 方法连接到槽
  3. 使用 QWidget 的 pyqtConfigure() 方法配置
  4. 通过函数名称连接槽

下面这个例子演示了同一个信号使用不同的方法连接不同的槽的方法,也演示了如何通过 Widget 的 objectName 来找到它,还演示了如何使用 Widget 的 pyqtConfigure() 方法来配置它的属性。

signals_slots_demo.pyw

from PyQt5.QtWidgets import (QApplication, QWidget, QFontComboBox, QLabel,
                             QHBoxLayout, QPushButton, QMessageBox, QVBoxLayout)
from PyQt5.QtCore import QMetaObject


class MainWindow(QWidget):
    def __init__(self):
        super().__init__(None)

        self.initUI()

    def initUI(self):
        main_layout = QHBoxLayout()

        # 第一种信号与槽连接的方法
        cb_font = QFontComboBox(currentFontChanged=self.changeLabelFont)
        cb_font.pyqtConfigure(objectName='fontCombo', editable=False)
        # 第二种信号与槽连接的方法
        cb_font.currentFontChanged.connect(self.changeButtonFont)
        main_layout.addWidget(cb_font)

        label = QLabel()
        label.pyqtConfigure(text='示例文本!', objectName='label')

        main_layout.addWidget(label)

        closeButton = QPushButton('关闭')
        # 第三种连接信号与槽的方法
        closeButton.pyqtConfigure(objectName='button', clicked=self.close)
        main_layout.addWidget(closeButton)
        
        vhbox = QVBoxLayout()
        vhbox.addLayout(main_layout)
        vhbox.addStretch(1)
        self.setLayout(vhbox)

        # 第四种连接信号与槽的方法
        QMetaObject.connectSlotsByName(self)

    def changeLabelFont(self, c_font):
        label = self.findChild(QLabel, 'label')
        label.setFont(c_font)

    def changeButtonFont(self, c_font):
        button = self.findChild(QPushButton, 'button')
        button.setFont(c_font)

    def on_fontCombo_currentFontChanged(self, c_font):
        """
        通过 Widget 的 objectName 来连接槽,槽的名称如下所示:
        on_<object name>_<signal name>(<signal parameters>)
        在我们的这个例子中, object name 是 fontCombo; signal name 是 currentFontChanged; 信号的参数是 c_font, 表示选择的字体
        """
        QMessageBox.information(self, '提示信息', '选择的字体名称是: <b>%s</b>' % c_font.family())


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 400)
    w.show()
    sys.exit(app.exec_())
signals_slots_demo.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,497评论 25 709
  • 信号和槽(Signals and Slots) Qt库第一个认识到在几乎所有情况下,程序员不需要或甚至不想知道所有...
    珞珈村下山阅读 10,113评论 0 23
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,327评论 19 139
  • 转自:作者简介作者:唐新华 (xhsmart@263.net)软件工程师    信号和槽作为QT的核心机制在QT编...
    njukay阅读 1,409评论 0 49
  • 文|袁小球 今年在一个公司实习的时候,遇见了一个让我充满好奇的女人。公司是开放式的办公环境,每天早晨有人定时打扫。...
    袁小球阅读 34,831评论 252 1,378

友情链接更多精彩内容