测试环境
pip list
的输出信息如下Package Version ---------- ------- build 0.7.0 colorama 0.4.4 packaging 21.3 pep517 0.12.0 pip 21.3.1 pyparsing 3.0.6 PySide6 6.2.3 setuptools 60.5.0 shiboken6 6.2.3 tomli 2.0.0 wheel 0.37.1
- Python 版本:3.9.9
- 操作系统:windows 10
问题描述
用designer创建了一个空的主窗体(Main Window),然后添加一个名为acceptBtn
的按钮。然后用uic
工具生成了common_signal_slot_ui.py
文件。
然后,新建一个common_ones.py
文件,代码内容如下。
from PySide6 import QtCore
from PySide6.QtCore import Signal,Slot
from PySide6.QtWidgets import QMainWindow, QGraphicsView, QFileDialog, QApplication, QMessageBox,QHBoxLayout
import sys
class MainWindow(QMainWindow):
def __init__(self, app):
super().__init__()
self.app = app
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
QtCore.QMetaObject.connectSlotsByName(self) # 开启自动连接信号和槽.
@QtCore.Slot()
def on_acceptBtn_clicked(self):
print("accept")
if __name__ == "__main__":
from common_signal_slot_ui import Ui_MainWindow
app = QApplication(sys.argv)
window = MainWindow(app)
window.show()
sys.exit(app.exec())
结果,程序运行起来后,点击一次该按钮,会print两次“accept”。说明槽函数on_acceptBtn_clicked
被执行了两次
解决方案
- 槽函数被执行多次,通常是因为connect了多次。显然并没有
- 通过检查
uic
工具生成的.py文件,发现它里面也有一行QtCore.QMetaObject.connectSlotsByName
.- 说明,是因为
QtCore.QMetaObject.connectSlotsByName
执行了两次,导致的这个问题 - 注释掉
common_ones.py
文件中的此行代码后,问题解决了
- 说明,是因为