[{"data":1,"prerenderedAt":570},["ShallowReactive",2],{"post-2025-08-20-pyqt5":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"body":15,"_type":564,"_id":565,"_source":566,"_file":567,"_stem":568,"_extension":569},"\u002Fblog\u002F2025-08-20-pyqt5","blog",false,"","PyQt5-信号与槽","PyQt5信号与槽机制详解，Qt核心通信原理、内置信号与自定义信号的使用。","2025-08-20",[12,13,14],"Python","PyQt5","GUI",{"type":16,"children":17,"toc":558},"root",[18,27,31,54,67,76,81,116,121,129,135,138,151,179,187,207,215,251,259,303,316,324,345,365,377,385,391,394,399,407,420,462,482,488,491,518,532,544,552],{"type":19,"tag":20,"props":21,"children":23},"element","h2",{"id":22},"_1信号与槽的基本概念",[24],{"type":25,"value":26},"text","1  信号与槽的基本概念",{"type":19,"tag":28,"props":29,"children":30},"hr",{},[],{"type":19,"tag":32,"props":33,"children":34},"p",{},[35,37,44,46,52],{"type":25,"value":36},"信号（signal）与槽（slot）是Qt的核心机制，也是进行PyQt5编程时对象之间通信的基础。在PyQt5中，每一个",{"type":19,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":25,"value":43},"QObject",{"type":25,"value":45},"对象（包括各种窗口和控件）都支持信号与槽机制，通过信号与槽的关联，就可以实现对象之间的通信。当信号发射时，连接的槽函数（方法）将会自动执行。在PyQt5中，信号与槽是通过对象的",{"type":19,"tag":38,"props":47,"children":49},{"className":48},[],[50],{"type":25,"value":51},"signal.connect()方法",{"type":25,"value":53},"进行连接的。",{"type":19,"tag":32,"props":55,"children":56},{},[57,59,65],{"type":25,"value":58},"PyQt5的窗口控件中有很多内置的信号，例如，如图所示为",{"type":19,"tag":38,"props":60,"children":62},{"className":61},[],[63],{"type":25,"value":64},"MainWindow",{"type":25,"value":66},"主窗口的部分内置信号与槽。",{"type":19,"tag":32,"props":68,"children":69},{},[70],{"type":19,"tag":71,"props":72,"children":75},"img",{"alt":73,"src":74},"Pasted image 20250827142539","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827142539.png",[],{"type":19,"tag":32,"props":77,"children":78},{},[79],{"type":25,"value":80},"PyQt5中使用信号与槽的主要特点如下：",{"type":19,"tag":82,"props":83,"children":84},"ul",{},[85,91,96,101,106,111],{"type":19,"tag":86,"props":87,"children":88},"li",{},[89],{"type":25,"value":90},"一个信号可以连接多个槽。",{"type":19,"tag":86,"props":92,"children":93},{},[94],{"type":25,"value":95},"一个槽可以监听多个信号。",{"type":19,"tag":86,"props":97,"children":98},{},[99],{"type":25,"value":100},"信号与信号之间可以互连。",{"type":19,"tag":86,"props":102,"children":103},{},[104],{"type":25,"value":105},"信号与槽的连接可以跨线程。",{"type":19,"tag":86,"props":107,"children":108},{},[109],{"type":25,"value":110},"信号与槽的连接方式即可以是同步，也可以是异步。",{"type":19,"tag":86,"props":112,"children":113},{},[114],{"type":25,"value":115},"信号的参数可以是任何的Python类型。",{"type":19,"tag":32,"props":117,"children":118},{},[119],{"type":25,"value":120},"信号与槽的连接工作示意过程如图所示。",{"type":19,"tag":32,"props":122,"children":123},{},[124],{"type":19,"tag":71,"props":125,"children":128},{"alt":126,"src":127},"Pasted image 20250827142753","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827142753.png",[],{"type":19,"tag":20,"props":130,"children":132},{"id":131},"_2编辑信号与槽",[133],{"type":25,"value":134},"2  编辑信号与槽",{"type":19,"tag":28,"props":136,"children":137},{},[],{"type":19,"tag":32,"props":139,"children":140},{},[141,143,149],{"type":25,"value":142},"例如，通过信号（signal）与槽（slot）实现一个",{"type":19,"tag":144,"props":145,"children":146},"strong",{},[147],{"type":25,"value":148},"单击按钮关闭主窗口",{"type":25,"value":150},"的运行效果，具体操作步骤如下：",{"type":19,"tag":32,"props":152,"children":153},{},[154,156,162,164,169,171,177],{"type":25,"value":155},"1）打开Qt Designer设计器，从左侧的工具箱中向窗口中添加一个",{"type":19,"tag":38,"props":157,"children":159},{"className":158},[],[160],{"type":25,"value":161},"PushButton",{"type":25,"value":163},"按钮，并设置按钮的",{"type":19,"tag":38,"props":165,"children":167},{"className":166},[],[168],{"type":25,"value":25},{"type":25,"value":170},"属性为",{"type":19,"tag":38,"props":172,"children":174},{"className":173},[],[175],{"type":25,"value":176},"关闭",{"type":25,"value":178},"，如图所示。",{"type":19,"tag":32,"props":180,"children":181},{},[182],{"type":19,"tag":71,"props":183,"children":186},{"alt":184,"src":185},"Pasted image 20250827143220","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827143220.png",[],{"type":19,"tag":32,"props":188,"children":189},{},[190,192,197,199,205],{"type":25,"value":191},"2）选中添加的",{"type":19,"tag":38,"props":193,"children":195},{"className":194},[],[196],{"type":25,"value":176},{"type":25,"value":198},"按钮，在菜单栏中选择",{"type":19,"tag":38,"props":200,"children":202},{"className":201},[],[203],{"type":25,"value":204},"编辑信号\u002F槽",{"type":25,"value":206},"菜单项，然后按住鼠标左键拖动至窗口的空白区域，如图所示。",{"type":19,"tag":32,"props":208,"children":209},{},[210],{"type":19,"tag":71,"props":211,"children":214},{"alt":212,"src":213},"Pasted image 20250827143500","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827143500.png",[],{"type":19,"tag":32,"props":216,"children":217},{},[218,220,226,228,234,236,242,244,250],{"type":25,"value":219},"3）拖动至窗口的空白区域松开鼠标后，将自动弹出",{"type":19,"tag":38,"props":221,"children":223},{"className":222},[],[224],{"type":25,"value":225},"配置连接",{"type":25,"value":227},"对话框，首先选中",{"type":19,"tag":38,"props":229,"children":231},{"className":230},[],[232],{"type":25,"value":233},"显示从QWidget继承的信号和槽",{"type":25,"value":235},"复选框，然后在上方的信号与槽列表中分别选择选中",{"type":19,"tag":38,"props":237,"children":239},{"className":238},[],[240],{"type":25,"value":241},"clicked()",{"type":25,"value":243},"和",{"type":19,"tag":38,"props":245,"children":247},{"className":246},[],[248],{"type":25,"value":249},"close()",{"type":25,"value":178},{"type":19,"tag":32,"props":252,"children":253},{},[254],{"type":19,"tag":71,"props":255,"children":258},{"alt":256,"src":257},"Pasted image 20250827143731","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827143731.png",[],{"type":19,"tag":260,"props":261,"children":262},"blockquote",{},[263],{"type":19,"tag":32,"props":264,"children":265},{},[266,271,273,278,280,285,287,293,295,301],{"type":19,"tag":144,"props":267,"children":268},{},[269],{"type":25,"value":270},"Info:",{"type":25,"value":272}," 说明\n上图中，选中的",{"type":19,"tag":38,"props":274,"children":276},{"className":275},[],[277],{"type":25,"value":241},{"type":25,"value":279},"为按钮的信号，然后选中的",{"type":19,"tag":38,"props":281,"children":283},{"className":282},[],[284],{"type":25,"value":249},{"type":25,"value":286},"为槽函数（方法），工作逻辑是，单击按钮时发射",{"type":19,"tag":38,"props":288,"children":290},{"className":289},[],[291],{"type":25,"value":292},"clicked信号",{"type":25,"value":294},"，该信号被主窗口的",{"type":19,"tag":38,"props":296,"children":298},{"className":297},[],[299],{"type":25,"value":300},"close()槽函数",{"type":25,"value":302},"（方法）所捕获，并触发了关闭主窗口的行为。",{"type":19,"tag":32,"props":304,"children":305},{},[306,308,314],{"type":25,"value":307},"4）单击",{"type":19,"tag":38,"props":309,"children":311},{"className":310},[],[312],{"type":25,"value":313},"OK",{"type":25,"value":315},"按钮，即可完成信号与槽的关联，效果如图所示。",{"type":19,"tag":32,"props":317,"children":318},{},[319],{"type":19,"tag":71,"props":320,"children":323},{"alt":321,"src":322},"Pasted image 20250827143948","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827143948.png",[],{"type":19,"tag":32,"props":325,"children":326},{},[327,329,335,337,343],{"type":25,"value":328},"保存",{"type":19,"tag":38,"props":330,"children":332},{"className":331},[],[333],{"type":25,"value":334},".ui",{"type":25,"value":336},"文件，并使用PyCharm中配置的Pyuic工具将其转换为",{"type":19,"tag":38,"props":338,"children":340},{"className":339},[],[341],{"type":25,"value":342},".py",{"type":25,"value":344},"文件，转换后实现单击按钮关闭窗口的关键代码如下：",{"type":19,"tag":346,"props":347,"children":351},"pre",{"className":348,"code":349,"language":350,"meta":7,"style":7},"language-python shiki shiki-themes github-dark","self.pushButton.clicked.connect(MainWindow.close)\n","python",[352],{"type":19,"tag":38,"props":353,"children":354},{"__ignoreMap":7},[355],{"type":19,"tag":356,"props":357,"children":360},"span",{"class":358,"line":359},"line",1,[361],{"type":19,"tag":356,"props":362,"children":363},{},[364],{"type":25,"value":349},{"type":19,"tag":32,"props":366,"children":367},{},[368,370,375],{"type":25,"value":369},"为转换后的Python代码添加程序入口，然后运行程序，效果如图所示，单击",{"type":19,"tag":38,"props":371,"children":373},{"className":372},[],[374],{"type":25,"value":176},{"type":25,"value":376},"按钮，即可关闭当前窗口。",{"type":19,"tag":32,"props":378,"children":379},{},[380],{"type":19,"tag":71,"props":381,"children":384},{"alt":382,"src":383},"Pasted image 20250827145233","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827145233.png",[],{"type":19,"tag":20,"props":386,"children":388},{"id":387},"_3自定义槽",[389],{"type":25,"value":390},"3  自定义槽",{"type":19,"tag":28,"props":392,"children":393},{},[],{"type":19,"tag":32,"props":395,"children":396},{},[397],{"type":25,"value":398},"在前面的内容中，介绍了如何将控件的信号与PyQt5内置的槽函数相关联，除此之外，用户还可以自定义槽，自定义槽本质上就是自定义一个函数，该函数来实现相应的功能。",{"type":19,"tag":32,"props":400,"children":401},{},[402],{"type":19,"tag":144,"props":403,"children":404},{},[405],{"type":25,"value":406},"实例 信号与自定义槽的绑定",{"type":19,"tag":32,"props":408,"children":409},{},[410,412,418],{"type":25,"value":411},"自定义一个槽函数，用来单击按钮时，弹出一个",{"type":19,"tag":38,"props":413,"children":415},{"className":414},[],[416],{"type":25,"value":417},"欢迎进入PyQt5编程世界",{"type":25,"value":419},"的信息提示框。代码如下：",{"type":19,"tag":346,"props":421,"children":423},{"className":348,"code":422,"language":350,"meta":7,"style":7},"def showMessage(self):  \n    from PyQt5.QtWidgets import QMessageBox  # 导入QMessageBox类  \n    # 使用information()方法弹出信息提示框  \n    QMessageBox.information(MainWindow,\"提示框\",\"欢迎进入PyQt5编程世界\",QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)\n",[424],{"type":19,"tag":38,"props":425,"children":426},{"__ignoreMap":7},[427,435,444,453],{"type":19,"tag":356,"props":428,"children":429},{"class":358,"line":359},[430],{"type":19,"tag":356,"props":431,"children":432},{},[433],{"type":25,"value":434},"def showMessage(self):  \n",{"type":19,"tag":356,"props":436,"children":438},{"class":358,"line":437},2,[439],{"type":19,"tag":356,"props":440,"children":441},{},[442],{"type":25,"value":443},"    from PyQt5.QtWidgets import QMessageBox  # 导入QMessageBox类  \n",{"type":19,"tag":356,"props":445,"children":447},{"class":358,"line":446},3,[448],{"type":19,"tag":356,"props":449,"children":450},{},[451],{"type":25,"value":452},"    # 使用information()方法弹出信息提示框  \n",{"type":19,"tag":356,"props":454,"children":456},{"class":358,"line":455},4,[457],{"type":19,"tag":356,"props":458,"children":459},{},[460],{"type":25,"value":461},"    QMessageBox.information(MainWindow,\"提示框\",\"欢迎进入PyQt5编程世界\",QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)\n",{"type":19,"tag":260,"props":463,"children":464},{},[465],{"type":19,"tag":32,"props":466,"children":467},{},[468,472,474,480],{"type":19,"tag":144,"props":469,"children":470},{},[471],{"type":25,"value":270},{"type":25,"value":473}," 说明\n上面代码中用到了",{"type":19,"tag":38,"props":475,"children":477},{"className":476},[],[478],{"type":25,"value":479},"QMessageBox",{"type":25,"value":481},"类，该类是PyQt5中提供的一个对话框类",{"type":19,"tag":20,"props":483,"children":485},{"id":484},"_4将自定义槽连接到信号",[486],{"type":25,"value":487},"4  将自定义槽连接到信号",{"type":19,"tag":28,"props":489,"children":490},{},[],{"type":19,"tag":32,"props":492,"children":493},{},[494,496,501,503,509,511,516],{"type":25,"value":495},"在自定义槽函数之后，即可与信号进行关联，比如，这里与",{"type":19,"tag":38,"props":497,"children":499},{"className":498},[],[500],{"type":25,"value":161},{"type":25,"value":502},"按钮的",{"type":19,"tag":38,"props":504,"children":506},{"className":505},[],[507],{"type":25,"value":508},"clicked",{"type":25,"value":510},"信号关联，即在单击",{"type":19,"tag":38,"props":512,"children":514},{"className":513},[],[515],{"type":25,"value":161},{"type":25,"value":517},"按钮时，弹出信息提示框，将自定义槽连接到信号的代码如下：",{"type":19,"tag":346,"props":519,"children":521},{"className":348,"code":520,"language":350,"meta":7,"style":7},"self.pushButton.clicked.connect(self.showMessage)\n",[522],{"type":19,"tag":38,"props":523,"children":524},{"__ignoreMap":7},[525],{"type":19,"tag":356,"props":526,"children":527},{"class":358,"line":359},[528],{"type":19,"tag":356,"props":529,"children":530},{},[531],{"type":25,"value":520},{"type":19,"tag":32,"props":533,"children":534},{},[535,537,542],{"type":25,"value":536},"运行程序，单击窗口中的",{"type":19,"tag":38,"props":538,"children":540},{"className":539},[],[541],{"type":25,"value":161},{"type":25,"value":543},"按钮，即可弹出信息提示框，效果如图所示。",{"type":19,"tag":32,"props":545,"children":546},{},[547],{"type":19,"tag":71,"props":548,"children":551},{"alt":549,"src":550},"Pasted image 20250827145957","\u002Fimages\u002Fblog\u002Fpyqt5\u002FPasted%20image%2020250827145957.png",[],{"type":19,"tag":553,"props":554,"children":555},"style",{},[556],{"type":25,"value":557},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":437,"depth":437,"links":559},[560,561,562,563],{"id":22,"depth":437,"text":26},{"id":131,"depth":437,"text":134},{"id":387,"depth":437,"text":390},{"id":484,"depth":437,"text":487},"markdown","content:blog:2025-08-20-pyqt5-信号与槽.md","content","blog\u002F2025-08-20-pyqt5-信号与槽.md","blog\u002F2025-08-20-pyqt5-信号与槽","md",1780801018177]