PyQt,PySide-槽函数被执行了两次

在使用PySide6和Qt Designer创建GUI应用时,遇到一个问题:点击按钮导致槽函数被调用两次。原因是QtCore.QMetaObject.connectSlotsByName被调用了两次。解决方案是注释掉额外的调用,确保槽函数只连接一次,从而修复了问题。
摘要由CSDN通过智能技术生成

测试环境

  • 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文件中的此行代码后,问题解决了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一款跨平台的图形用户界面开发框架,提供了丰富的GUI控件和功能以及跨平台的能力。PyQtPySide是在Qt基础上开发Python绑定库,使得我们可以使用Python语言来编Qt应用程序。 PyQtPySide提供了和Qt类似的功能和API,使得我们可以方便地在Python中使用Qt的各种特性,如窗口管理、布局管理器、事件处理和信号机制等。它们支持Qt的所有模块,因此可以利用Qt的强大功能开发出高度可定制的应用程序。 Custom Widgets是指自定义的用户界面部件,可以根据需求自己进行开发或者对现有的控件进行定制。在PyQtPySide中,我们可以使用Qt的功能来创建自定义的控件,通过继承已有的控件类来添加新的功能或者修改控件的外观和行为。这样可以满足特定需求并增加应用程序的交互性和美观性。 开发自定义的控件需要理解Qt的事件和绘图机制,掌握Qt提供的绘图功能和控件定制的技术。我们可以使用Qt的绘图API来绘制自定义的界面元素,并且可以通过事件和信号来实现控件的交互性。在PyQtPySide中,可以利用Python的特性和语法来更加方便地进行控件的开发和定制。 总之,QtPyQtPySide的结合可以帮助我们快速开发跨平台的应用程序,并且可以通过自定义控件来满足特定需求。这些工具和技术的使用可以大大提高应用程序的开发效率和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值