考虑这个设置:
主脚本,main.py:
import sys
from PyQt5 import uic
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi("mw.ui", self)
def on_btnFunc_clicked(self):
print('naked function call')
@pyqtSlot()
def on_btnSlot_clicked(self, bool):
print('slotted function call')
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
Qt Designer .ui 表单,mw.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>153</width>
<height>83</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="btnFunc">
<property name="text">
<string>naked func</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnSlot">
<property name="text">
<string>slotted func</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
此设置使用 Qt 的信号槽自动装配机制将按钮点击绑定到相应的回调。为什么裸回调会被调用两次,而插槽只按预期调用一次?
我发现了这个和这个,但是这些设置与我的有点不同,因为我不手动绑定信号,也不安装事件过滤器。
我认为这种行为可能是由于具有不同签名的信号绑定到同一个插槽而发生的,但是(如果我理解正确的话)QPushButton 只有一个 clicked()信号。
有人可以请解释一下吗?
慕桂英4014372
相关分类