En la última lección, aprendimos a vincular botones a funciones para que podamos expandir las funciones nosotros mismos, por lo que hoy aprenderemos otro método para vincular botones a funciones. Enlace de revisión de la lección anterior: Haga clic en mí—>PyQty5—Lección 2
Primer Ministro, comentamos las funciones y objetos vinculados en el código de la lección anterior.
Código (sin título.py):
# -*- coding: utf-8 -*-import sys
# Form implementation generated from reading ui file 'untitled.ui'## Created by: PyQt5 UI code generator 5.15.6## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgets
classUi_Dialog(object):defsetupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400,300)
self.nhbutton = QtWidgets.QPushButton(Dialog)
self.nhbutton.setGeometry(QtCore.QRect(90,50,201,23))
self.nhbutton.setObjectName("nhbutton")# self.nhbutton.clicked.connect(self.print_nh)
self.hellobutton = QtWidgets.QPushButton(Dialog)
self.hellobutton.setGeometry(QtCore.QRect(90,100,201,23))
self.hellobutton.setObjectName("hellobutton")# self.hellobutton.clicked.connect(self.print_hello_world)
self.pushButton_3 = QtWidgets.QPushButton(Dialog)
self.pushButton_3.setGeometry(QtCore.QRect(140,150,75,23))
self.pushButton_3.setObjectName("pushButton_3")
self.retranslateUi(Dialog)
self.pushButton_3.clicked.connect(Dialog.reject)# type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)defretranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog","Dialog"))
self.nhbutton.setText(_translate("Dialog","点击按钮打印你好"))
self.hellobutton.setText(_translate("Dialog","点击按钮打印HelloWorld"))
self.pushButton_3.setText(_translate("Dialog","关闭窗口"))# if __name__ == '__main__':# app = QtWidgets.QApplication(sys.argv)# mainWindow = QtWidgets.QDialog()# ui = Ui_Dialog()# ui.setupUi(mainWindow)# mainWindow.show()# sys.exit(app.exec_())
1. Primero, creamos un nuevo archivo py, y el nombre (main.py) también puede ser arbitrario
Importe las bibliotecas que necesitamos:
from test_button import Ui_MainWindow
import sys
from PyQt5.QtGui import QIcon # 用于添加图标from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication
from PyQt5.QtCore import pyqtSlot
2-1 Atributos de inicialización de clase \ explicación de función
super().__init__()# Utilice la superclase para heredar las propiedades y métodos de la clase padre
self.setupUi(self)# Construir la interfaz del formulario es la función de untitled.py
self.setWindowIcon(QIcon("./img/result.png")), es el ícono en la esquina superior izquierda, si no hay foto comenta esta línea
self.setWindowTitle("Test_button")# Establecer el tema del formulario
2-2 def initUI(yo):
Esta función es la función a la que está vinculado nuestro botón.
self.nhbutton.clicked.connect(self.print_nihao): Esta es la función self.nhbuttonvinculante * * en nuestro [untitled.py]print_nihao
Puntos clave: @pyqtSlot()的解释!(La explicación a continuación es de ChatGPT)
setupUi()Se llamará al método QtCore .QMetaObject.connectSlotsByName(), que es un método estático, y creará algunas conexiones de ranura de señal entre las diversas señales del widget de formulario y nuestro método de subclase utilizando una convención de nomenclatura específica. Cualquier nombre de método en forma de on_widgetName_ signalName( on_控件名字_信号名字) en el formulario se conectará con la señal del widget.
@pyqtSlot()es un decorador que se utiliza para especificar explícitamente un método como una función de ranura de PyQt. La función de ranura en PyQt se utiliza para manejar la conexión de la señal. Cuando se activa la señal, se llamará a la función de ranura.
En mi código, @pyqtSlot()el decorador se usa para especificar on_nhbutton_clickedel método como una función de ranura, que se llamará cuando se haga clic en [nhbutton]. 因此 on_nhbutton_clicked函数没有被connect链接, y dado que utilicé print_hello_worldel método como ranura para el botón personalizado hellobutton, pero no le apliqué un decorador, ¡todavía funciona porque es un enlace normal!
@pyqtSlot()De hecho, si no usa un decorador delante del método, PyQt tratará automáticamente el método como una función de ranura (más o no, ambas son funciones de ranura), porque PyQt tiene una convención de nomenclatura basada en el nombre y los parámetros. del método . Entonces, incluso si no especifica explícitamente un método como ranura, PyQt aún lo llamará como ranura cuando lo conecte a una señal.
En resumen, usar @pyqtSlot()un decorador para especificar explícitamente un método como una ranura puede mejorar la legibilidad del código, indicando claramente que el método está diseñado para manejar señales. Pero si no se utiliza el decorador, PyQt seguirá tratando el método como una función de ranura, por lo que en su código, la función se puede realizar sin el decorador. (我的总结:加不加都是槽函数,加了就需要注意函数名的特殊写法从而进行信号绑定,不加就是普通槽函数,就需要connec绑定按钮 )
Entonces descubrimos: on_nhbutton_clickedno vinculé esta función, pero se ejecutó normalmente, porque la función es una función de ranura y está vinculada a una señal, ¡y el nombre de la función se ajusta al nombre QtCore .QMetaObject.connectSlotsByName()especial! ! Porque on_nhbutton_clicked[] en : nhbuttonestá en untitled.py, como se muestra a continuación:
Por lo tanto print_hello_world, es una función de ranura ordinaria sin enlace de señal, pero la hemos vinculado al botón [self.hellobutton] en la función initUI, ¡para que aún pueda ejecutarse normalmente! !
Código de versión completa 1: untitled.py, tómelo usted mismo
Esta es la tercera lección de nuestro aprendizaje de PyQty5 de hoy. Hoy aprendimos otra forma de escribir funciones enlazadas. ¡Puedes practicar más! ! ¡Yo también trabajaré duro!
espero que todos tengan que ayudar
Un pequeño programador dedicado a la ofimática#
He visto esto, sigue + me gusta + marcador = ¡no te pierdas! !
Si desea saber más sobre la ofimática de Python, ¡preste atención!