最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧(自定義信號(hào)與槽)詳解與實(shí)例

 更新時(shí)間:2020年03月06日 14:32:26   作者:jia666666  
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽的高級(jí)知識(shí)(自定義信號(hào)與槽)詳解與實(shí)例,需要的朋友可以參考下

PyQt5信號(hào)與槽高級(jí)自定義信號(hào)與槽

所謂高級(jí)自定義信號(hào)與槽,指的就是我們可以以自己喜歡的方式定義信號(hào)與槽函數(shù),并傳遞參數(shù),自定義信號(hào)的一般流程如下

  • 定義信號(hào)
  • 定義槽函數(shù)
  • 連接信號(hào)與槽函數(shù)
  • 發(fā)射信號(hào)

1、定義信號(hào)

通過類成員變量定義信號(hào)對(duì)象

  #無參數(shù)的信號(hào)
  signal1=pyqtSignal()
  #帶一個(gè)參數(shù)(整數(shù))的信號(hào)
  signal2=pyqtSignal(int)
  #帶兩個(gè)參數(shù)(整數(shù),字符串)的信號(hào)
  signal3=pyqtSignal(int,str)
  #帶一個(gè)參數(shù)(列表)的信號(hào)
  signal4=pyqtSignal(list)
  #帶一個(gè)參數(shù)(字典)的信號(hào)
  signal5=pyqtSignal(dict)
  #帶(整數(shù) 字符串)或者(字符串)的信號(hào)
  signal6=pyqtSignal([int,str],[str])

2、定義槽函數(shù)

定義一個(gè)槽函數(shù),它有多個(gè)不同的輸入?yún)⑤敂?shù)

  def signalCall1( self ):
    print("signal1 emit")
  def signalCall2( self,val ):
    print('signal2 emit,value:',val)
  def signalCall3( self,val,text ):
    print('signall3 emit,value:',val,text)
  def signalCall4( self,val ):
    print('signal4 emit,value:',val)
  def signalCall5( self,val ):
    print('signal5 emit,value',val)
  def signalCall6( self,val,text ):
    print('signal6 emit,value',val,text)
  def signalCall7( self,val ):
    print('signal6 ovetload emit',val)

3、連接信號(hào)與槽函數(shù)

    #信號(hào)與槽函數(shù)的鏈接
    self.signal1.connect(self.signalCall1)
    self.signal2.connect(self.signalCall2)
    self.signal3.connect(self.signalCall3)
    self.signal4.connect(self.signalCall4)
    self.signal5.connect(self.signalCall5)
    self.signal6[int,str].connect(self.signalCall6)
    self.signal6[str].connect(self.signalCall7)

4、發(fā)射信號(hào)

    #信號(hào)發(fā)射
    self.signal1.emit()
    self.signal2.emit(1)
    self.signal3.emit(1,'第三個(gè)')
    self.signal4.emit([1,2,3,4])
    self.signal5.emit({"name":'JIA','age':'21'})
    self.signal6[int,str].emit(1,"第六")
    self.signal6[str].emit('第六')

5、實(shí)例

完整代碼如下

from PyQt5.QtCore import QObject,pyqtSignal
class CusSignal(QObject):
  #無參數(shù)的信號(hào)
  signal1=pyqtSignal()
  #帶一個(gè)參數(shù)(整數(shù))的信號(hào)
  signal2=pyqtSignal(int)
  #帶兩個(gè)參數(shù)(整數(shù),字符串)的信號(hào)
  signal3=pyqtSignal(int,str)
  #帶一個(gè)參數(shù)(列表)的信號(hào)
  signal4=pyqtSignal(list)
  #帶一個(gè)參數(shù)(字典)的信號(hào)
  signal5=pyqtSignal(dict)
  #帶(整數(shù) 字符串)或者(字符串)的信號(hào)
  signal6=pyqtSignal([int,str],[str])
  def __init__(self,parent=None):
    super(CusSignal, self).__init__(parent)
    #信號(hào)與槽函數(shù)的鏈接
    self.signal1.connect(self.signalCall1)
    self.signal2.connect(self.signalCall2)
    self.signal3.connect(self.signalCall3)
    self.signal4.connect(self.signalCall4)
    self.signal5.connect(self.signalCall5)
    self.signal6[int,str].connect(self.signalCall6)
    self.signal6[str].connect(self.signalCall7)
    #信號(hào)發(fā)射
    self.signal1.emit()
    self.signal2.emit(1)
    self.signal3.emit(1,'第三個(gè)')
    self.signal4.emit([1,2,3,4])
    self.signal5.emit({"name":'JIA','age':'21'})
    self.signal6[int,str].emit(1,"第六")
    self.signal6[str].emit('第六')
  #槽函數(shù)
  def signalCall1( self ):
    print("signal1 emit")
  def signalCall2( self,val ):
    print('signal2 emit,value:',val)
  def signalCall3( self,val,text ):
    print('signall3 emit,value:',val,text)
  def signalCall4( self,val ):
    print('signal4 emit,value:',val)
  def signalCall5( self,val ):
    print('signal5 emit,value',val)
  def signalCall6( self,val,text ):
    print('signal6 emit,value',val,text)
  def signalCall7( self,val ):
    print('signal6 ovetload emit',val)
if __name__ == '__main__':
  custSignal=CusSignal()

運(yùn)行結(jié)果如下

自定義參數(shù)的傳遞

在pyqt編程過程中,經(jīng)常會(huì)遇到給槽函數(shù)傳遞自定義參數(shù)的情況,比如有一個(gè)信號(hào)與槽函數(shù)的連接是

button.clicked.connect(show_page)

我們知道對(duì)于clicked信號(hào),它是沒有參數(shù)的,對(duì)于show_page函數(shù)來說,希望他可以接受參數(shù),希望show_page函數(shù)如下這樣

def show_page(self,name):

    print(name',點(diǎn)擊了')

于是就會(huì)產(chǎn)生一個(gè)問題,信號(hào)發(fā)出的參數(shù)個(gè)數(shù)與槽函數(shù)接受的參數(shù)個(gè)數(shù)不一,那么如何解決這個(gè)問題呢,這里提供兩種解決方法;

第一種:lamdba表達(dá)式

第二種:使用functools中的partial函數(shù)

兩種方法,下面均已寫上,自己可運(yùn)行查看,注意注釋

實(shí)例如下

import sys
from PyQt5.QtWidgets import *
from functools import partial
class WinForm(QMainWindow):
  def __init__(self,parent=None):
    super(WinForm, self).__init__(parent)
    #實(shí)例化兩個(gè)按鈕
    button1=QPushButton('Button1')
    button2=QPushButton('Button2')
    #todo 第一種方法
    #單擊信號(hào)關(guān)聯(lián)槽函數(shù),利用Lanbda表達(dá)式傳遞一個(gè)參數(shù)
    # button1.clicked.connect(lambda :self.onButtonClick(1))
    # button2.clicked.connect(lambda :self.onButtonClick(2))
    #
    #todo 第二種方法
    button1.clicked.connect(partial(self.onButtonClick, 1))
    button2.clicked.connect(partial(self.onButtonClick, 2))
    #實(shí)例化窗口
    main=QWidget()
    #設(shè)置窗口的布局,并向其中添加控件
    layout=QHBoxLayout(main)
    layout.addWidget(button1)
    layout.addWidget(button2)
    #設(shè)置為中央控件
    self.setCentralWidget(main)
  def onButtonClick( self,n ):
    #彈窗信息提示框,輸出被點(diǎn)擊的信息
    print("Button {0}".format(n))
    QMessageBox.information(self,'信息提示框','Button {0}'.format(n))
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=WinForm()
  form.show()
  sys.exit(app.exec_())

運(yùn)行效果如圖所示

代碼分析

重點(diǎn)解釋

使用lambda表達(dá)式傳遞按鈕數(shù)字給槽函數(shù),當(dāng)然還可以傳遞其他東西,甚至是按鈕本身

button1.clicked.connect(lambda :self.onButtonClick(1))

button2.clicked.connect(lambda :self.onButtonClick(2))

另一種方法是使用functools中的partial函數(shù)

button1.clicked.connect(partial(self.onButtonClick, 1))

button2.clicked.connect(partial(self.onButtonClick, 2))

本文主要介紹了PyQt5信號(hào)與槽的高級(jí)使用技巧(自定義信號(hào)與槽)詳解與實(shí)例,更多關(guān)于PyQt5信號(hào)與槽知識(shí)請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • Python實(shí)現(xiàn)奇數(shù)列與偶數(shù)列調(diào)換的方法詳解

    Python實(shí)現(xiàn)奇數(shù)列與偶數(shù)列調(diào)換的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)df的奇數(shù)列與偶數(shù)列調(diào)換位置,比如A列,B列,調(diào)換成B列,A列,感興趣的小伙伴可以了解一下
    2022-05-05
  • Python XML轉(zhuǎn)Json之XML2Dict的使用方法

    Python XML轉(zhuǎn)Json之XML2Dict的使用方法

    今天小編就為大家分享一篇Python XML轉(zhuǎn)Json之XML2Dict的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 這可能是最好玩的python GUI入門實(shí)例(推薦)

    這可能是最好玩的python GUI入門實(shí)例(推薦)

    這篇文章主要介紹了這可能是最好玩的python GUI入門實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋

    詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋

    本篇文章主要介紹了詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • python如何開啟多線程

    python如何開啟多線程

    這篇文章主要介紹了python如何開啟多線程問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn)詳解

    Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家分享了關(guān)于Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn),有興趣的朋友們可以參考下。
    2020-07-07
  • python編寫分類決策樹的代碼

    python編寫分類決策樹的代碼

    這篇文章主要為大家詳細(xì)介紹了python編寫分類決策樹的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python代碼庫之Tuple如何append添加元素問題

    Python代碼庫之Tuple如何append添加元素問題

    這篇文章主要介紹了Python代碼庫之Tuple如何append添加元素問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • PyCharm Terminal終端命令行Shell設(shè)置方式

    PyCharm Terminal終端命令行Shell設(shè)置方式

    這篇文章主要介紹了PyCharm Terminal終端命令行Shell設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python利用柯里化實(shí)現(xiàn)提高代碼質(zhì)量

    Python利用柯里化實(shí)現(xiàn)提高代碼質(zhì)量

    柯里化(Currying)是函數(shù)式編程中的一個(gè)重要概念,它可以將一個(gè)多參數(shù)函數(shù)轉(zhuǎn)化為一系列單參數(shù)函數(shù)的組合,本文將詳細(xì)解釋什么是柯里化,如何在Python中實(shí)現(xiàn)柯里化,感興趣的可以了解下
    2024-01-01

最新評(píng)論

恩施市| 雷州市| 杭锦后旗| 大宁县| 韶关市| 宝山区| 兰西县| 天长市| 太保市| 永春县| 本溪| 内黄县| 郯城县| 栾川县| 万源市| 北票市| 武宣县| 靖边县| 乌拉特后旗| 丰城市| 宝鸡市| 英德市| 桂东县| 余江县| 绥宁县| 都昌县| 邢台县| 阳谷县| 兴安县| 青铜峡市| 泰来县| 青冈县| 新密市| 陆川县| 凤庆县| 美姑县| 藁城市| 麻阳| 大同市| 旌德县| 萨嘎县|