添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
不爱学习的火腿肠  ·  python pandas: ...·  1 年前    · 
沉着的烈马  ·  如何将Qt Design Studio ...·  1 年前    · 
怕老婆的可乐  ·  win10亮度调节不了 - ...·  1 年前    · 

一、问题描述

简化一下场景,使用qt designer设计的窗口中,有一个pushButton按钮,名为my_button, 连接clicked信号和自定义的槽函数on_my_button_clicked(), 对按钮按下clicked后,发现槽函数执行了3次。

二、问题解析

其中on_xxx_clicked()函数的命名是on_对象名_signal名的规则,而这正是Qt的信号-槽默认的连接规则,也就是说你不对按钮进行任何connect时,而仅仅只是把槽函数写成on_对象名_signal形式,qt也会自动执行该函数,一旦你connect了按钮的clicked信号但响应clicked信号的槽函数命名不是on_对象名_signal名的规则,那么qt就不会自动执行on_对象名_signal名的规则函数,转而执行你定义的槽函数。上面代码connect信号到qt默认的信号-槽默认连接规则的槽函数上,且槽函数命名是on_对象名_signal名的规则,所以qt会执行两次,一次是connect连接的,一次是qt默认的(默认的槽函数和你conenct连接的槽函数相同,所以执行了多次)

三、解决方案

简单点的方案就是:
自定义的槽函数尽量不要命名为on_对象名_signal形式,避免与QT默认槽函数重名。

from PyQt 5.QtCore import pyqt Slot from PyQt 5.QtWidgets import QApplication, QMainWindow from mainwindow import Ui_MainWindow class Qm... class MainCode(QMainWindow,Excel_Data_Select_UI.Ui_MainWindow): def __init__(self): QMainWindow.__init__(self) Excel_Data_Select_UI.Ui...
以下是有 问题 的代码 from PyQt 5.QtCore import QThread, pyqt Signal, QByteArray from PyQt 5.QtNetwork import QTcpServer, QHostAddress import numpy as np from PyQt 5.QtCore import * from PyQt 5.QtWidgets import *
说来惭愧,会 执行 两遍是因为下面这条语句被写了两遍 self.pushButton_1.clicked.connect(self.on_click_1) 因为使用Qt Designer设定好响应 函数 后,用PyUIC自动生成的py代码中已经包含了一遍上述语句,然后我又在主文件里面写了一遍,所以会 执行 两遍,诸如窗口弹出两次……删掉多写的就好了
PyQt 函数 可以有多个输入参数,这些参数可以是任何Python对象。在连接信号和 时,可以指定 函数 的参数列表,以便在信号被触发时自动传递参数。 例如,假设我们有一个按钮,当它被点击时,需要将一些文本添加到一个文本框中。我们可以定义一个 函数 ,它接收两个参数:按钮对象和文本框对象。 ```python from PyQt 5.QtWidgets import QPushButton, QTextEdit, QWidget, QVBoxLayout, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): btn = QPushButton('Add Text', self) btn.move(20, 20) btn.clicked.connect(self.addText) self.textEdit = QTextEdit(self) self.textEdit.move(20, 60) self.setGeometry(300, 300, 300, 200) self.setWindowTitle(' PyQt 5 Example') def addText(self, btn, textEdit): text = 'Hello World!' textEdit.append(text) if __name__ == '__main__': import sys app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_()) 在上面的例子中,我们定义了一个按钮和一个文本框。当按钮被点击时,会触发addText() 函数 ,并将按钮对象和文本框对象作为参数传递给它。在 函数 中,我们将一些文本添加到文本框中。 注意,连接信号和 时,我们需要将按钮对象和文本框对象传递给 函数 。这可以通过使用lambda表达式来实现,例如: ```python btn.clicked.connect(lambda: self.addText(btn, self.textEdit)) 这样,当按钮被点击时,会调用addText() 函数 ,并将按钮对象和文本框对象作为参数传递给它。