PyQty5: Lección 3: Enlace de botones y funciones (2) (con código completo)

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


class Ui_Dialog(object):
    def setupUi(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)




    def retranslateUi(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:

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

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. Luego creamos una clase.

from untitled import Ui_Dialog
import sys
from PyQt5.QtGui import QIcon  # 用于添加图标
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication,QDialog
from PyQt5.QtCore import pyqtSlot


class Test_window(QDialog,QMainWindow, Ui_Dialog):  # 继承至界面文件的主窗口类

    def __init__(self):
        super().__init__()  # 使用超类,继承父类的属性及方法
        self.setupUi(self)  # 构造窗体界面
        # self.setWindowIcon(QIcon("./img/result.png"))
        self.setWindowTitle("Test_button")  # 设置窗体主题
        self.initUI()  # 构造功能函数
    def initUI(self):
        # 此处添加功能连接函数
        # self.nhbutton.clicked.connect(self.print_nihao)  # 自定义按钮连接自定义槽函数
        self.hellobutton.clicked.connect(self.print_hello_world)  # 自定义按钮连接自定义槽函数

    @pyqtSlot()
    def on_nhbutton_clicked(self):  # 利用QT自带槽函数直接连接按钮
        print("你好!!")

    def print_hello_world(self): # 而这个是自定义函数
        print("Hello,World!")


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

inserte la descripción de la imagen aquí

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:

inserte la descripción de la imagen aquí

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

Código de versión completa 2: main.py

from untitled import Ui_Dialog
import sys
from PyQt5.QtGui import QIcon  # 用于添加图标
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication,QDialog
from PyQt5.QtCore import pyqtSlot


class Test_window(QDialog,QMainWindow, Ui_Dialog):  # 继承至界面文件的主窗口类

    def __init__(self):
        super().__init__()  # 使用超类,继承父类的属性及方法
        self.setupUi(self)  # 构造窗体界面
        self.setWindowIcon(QIcon("./icon.png"))
        self.setWindowTitle("Test_button")  # 设置窗体主体
        self.initUI()  # 构造功能函数

    def initUI(self):
        # 此处添加功能连接函数
        # self.nhbutton.clicked.connect(self.print_nihao)  # 自定义按钮连接自定义槽函数
        self.hellobutton.clicked.connect(self.print_hello_world)  # 自定义按钮连接自定义槽函数

    @pyqtSlot()
    def on_nhbutton_clicked(self):  # 利用QT自带槽函数直接连接按钮
        print("你好!!")

    def print_hello_world(self):
        print("Hello,World!")



if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui2 = Test_window()
    ui2.show()
    sys.exit(app.exec_())

Vídeo de demostración:

Por favor agregue una descripción de la imagen.

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!

Supongo que te gusta

Origin blog.csdn.net/weixin_42636075/article/details/132454404
Recomendado
Clasificación