ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PyQt信号槽用法详解介绍与代码演示

2021-06-04 07:02:17  阅读:286  来源: 互联网

标签:__ layout self PyQt button1 详解 演示 def clicked


一  信号与槽的绑定

在窗口上加一个按钮,并绑定信号槽

        # 添加Button
        self.button1 = QPushButton('AAA')

        # 将信号与槽关联
        self.button1.clicked.connect(self.onClick_Button)

 这与C++的写法不同
     connect(ui.button1, SIGNAL(clicked()),this,SLOT(onClick_Button));

槽函数的定义

def onClick_Button(self):
        #获取触发的对象
        sender = self.sender()
        QMessageBox.information(self, '标题', sender.text() + '按钮被点击了')

运行结果如下:

本例子全部代码:

import sys

#导入代码需要的模块,就像C++需要添加头文件
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QHBoxLayout,QPushButton,QMessageBox
from PyQt5.QtGui import QIcon

class FirstMainWin(QMainWindow):

    #构造函数初始化Window
    def __init__(self):
        super(FirstMainWin,self).__init__()

        # 设置主窗口的标题
        self.setWindowTitle('第一个纯Python代码写的主窗口应用')

        # 设置窗口的尺寸
        self.resize(400,300)

        self.status = self.statusBar()

        self.status.showMessage('我是状态栏消息,5秒后消失',5000)

        # 添加Button
        self.button1 = QPushButton('AAA')

        # 将信号与槽关联
        self.button1.clicked.connect(self.onClick_Button)

        layout = QHBoxLayout()
        layout.addWidget(self.button1)

        mainFrame = QWidget()
        mainFrame.setLayout(layout)

        self.setCentralWidget(mainFrame)

    # 按钮槽函数
    def onClick_Button(self):
        #获取触发的对象
        sender = self.sender()
        QMessageBox.information(self, '标题', sender.text() + '按钮被点击了')

if __name__ == '__main__':
    app = QApplication(sys.argv)

    app.setWindowIcon(QIcon('JXC.ico'))
    main = FirstMainWin()
    main.show()

    sys.exit(app.exec_())

 

二 信号槽自动连接

     除了上面的连接方式,pyqt提供了类似java注解形势的信号槽自动连接。例如下面的形势:

@QtCore.pyqtSlot()
def on_okButton_clicked(self):
    print("点击了ok按钮")

@QtCore.pyqtSlot()
def on_cancelButton_clicked(self):
    print("点击了cancel按钮")

     如果槽函数写成on_控件名字_clicked的形势,在C++中是默认进行连接的,python里不行。还需要通过元对象信息进行设置。本例子的界面如下:

    点击这ok和cancel会分别打印不同的信息

、代码如下:

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys

class AutoSignalSlot(QWidget):
    def __init__(self):
        super(AutoSignalSlot,self).__init__()
        self.resize(300,100)
        self.okButton = QPushButton("ok",self)
        self.okButton.setObjectName("okButton")
        self.okButton1 = QPushButton("cancel",self)
        self.okButton1.setObjectName("cancelButton")
        layout = QHBoxLayout()
        layout.addWidget(self.okButton)
        layout.addWidget(self.okButton1)
        self.setLayout(layout)
        QtCore.QMetaObject.connectSlotsByName(self)

    @QtCore.pyqtSlot()
    def on_okButton_clicked(self):
        print("点击了ok按钮")

    @QtCore.pyqtSlot()
    def on_cancelButton_clicked(self):
        print("点击了cancel按钮")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = AutoSignalSlot()
    example.show()
    sys.exit(app.exec_())

    通过设置控件元对象名字,再绑定槽,其实这种反而复杂了

self.okButton = QPushButton("ok",self)
self.okButton.setObjectName("okButton")
QtCore.QMetaObject.connectSlotsByName(self)

三 lambda函数写信号槽

    pyqt使用lambda写信号槽,用法更灵活,可以给槽函数传不同参数,demo代码如下

from PyQt5.QtWidgets import *
import sys

class LambdaSlotArg(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(300,100)

        button1 = QPushButton("按钮1")
        button2 = QPushButton("按钮2")
        ok = 100
        button1.clicked.connect(lambda : self.onButtonClick(10,ok))
        button2.clicked.connect(lambda : self.onButtonClick(ok,-20))
        button1.clicked.connect(lambda : QMessageBox.information(self,"结果","单击了button1"))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)

    def onButtonClick(self,m,n):
        print("m + n =",m + n )
        QMessageBox.information(self,"结果",str(m+n))

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

四 partial参数化

  当有多个按钮公用一个槽函数,只需要改变某些参数即可实现不同功能,此时可以用partial关键字实现,代码如下:

from PyQt5.QtWidgets import *
import sys
from functools import partial

class PartialSlotArg(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Partial用法")

        button1 = QPushButton("按钮1")
        button2 = QPushButton("按钮2")
        x = 20
        y = -123
        button1.clicked.connect(partial(self.onButtonClick,10,20))
        button2.clicked.connect(partial(self.onButtonClick, x, y))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)

    def onButtonClick(self,m,n):
        print("m + n =",m + n )
        QMessageBox.information(self,"结果",str(m+n))

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

 

标签:__,layout,self,PyQt,button1,详解,演示,def,clicked
来源: https://blog.51cto.com/u_12570763/2855322

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有