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

淺談pyqt5中信號與槽的認(rèn)識

 更新時間:2019年02月17日 11:26:49   作者:水痕001  
這篇文章主要介紹了淺談pyqt5中信號與槽的認(rèn)識,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、介紹

信號(Signal)和槽(Slot)是Qt中的核心機(jī)制,也是PyQt變成中對象之間進(jìn)行通信的機(jī)制

在pyqt5中,每一個QObject對象和pyqt中所有繼承自QWidget的控件都支持信號和槽

當(dāng)信號發(fā)射時,連接槽函數(shù)將會自動執(zhí)行,pyqt5中信號與槽通過connect()函數(shù)連接起來的。

在pyqt5中信號主要分兩類:

1.內(nèi)置信號(詳細(xì)參考各個組件)
2.自定義信號(主要用于組件之間數(shù)據(jù)的傳遞與窗口交互)

二、內(nèi)置信號的簡單介紹

使用connect()方法將信號與槽函數(shù)綁定在一起,使用disconnect()函數(shù)將信號與槽解除綁定

1、按鈕點(diǎn)擊事件(舉例)

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('按鈕事件')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按鈕', self)
    self.init_ui()

  def init_ui(self):
    self.btn.resize(100, 30)
    self.btn.move(100, 50)

    self.btn.clicked.connect(self.btn_hand)

  def btn_hand(self):
    print('按鈕點(diǎn)擊了')


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

2、如果連接的事件要傳遞參數(shù)直接使用lambda函數(shù)

...
def init_ui(self):
  self.btn.resize(100, 30)
  self.btn.move(100, 50)

  self.btn.clicked.connect(lambda: self.btn_hand(1))

def btn_hand(self, flag):
  print('按鈕點(diǎn)擊了:{}'.format(flag))
...

三、自定義信號

1、最基本無參數(shù)的信號與槽

import sys
from PyQt5.Qt import *


class SignalObj(QObject):
  """
  定義一個信號的類
  """
  # 自定義一個信號
  sendMsg = pyqtSignal()

  def __init__(self):
    super().__init__()

  def run(self):
    self.sendMsg.emit()


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('自定義事件')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按鈕', self)
    self.send = SignalObj()
    # 將事件與槽建立關(guān)聯(lián)
    self.send.sendMsg.connect(self.slot_hand)
    self.init_ui()

  def init_ui(self):
    # 系統(tǒng)中自帶的事件與槽函數(shù)建立連接
    self.btn.clicked.connect(self.btn_hand)

  def btn_hand(self):
    self.send.run()

  @staticmethod
  def slot_hand():
    print('我是自定義的槽函數(shù)')


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

2、信號中發(fā)射出數(shù)據(jù)

import sys
from PyQt5.Qt import *


class SignalObj(QObject):
  """
  定義一個信號的類
  """
  # 自定義一個信號,注意這個地方定義約束發(fā)送出去的參數(shù)類型,下面要一致
  sendMsg = pyqtSignal(str)

  def __init__(self):
    super().__init__()

  def run(self):
    self.sendMsg.emit('hello')


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('自定義事件')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按鈕', self)
    self.send = SignalObj()
    # 將事件與槽建立關(guān)聯(lián)
    self.send.sendMsg.connect(self.slot_hand)
    self.init_ui()

  def init_ui(self):
    # 系統(tǒng)中自帶的事件與槽函數(shù)建立連接
    self.btn.clicked.connect(self.btn_hand)

  def btn_hand(self):
    self.send.run()

  @staticmethod
  def slot_hand(msg):
    print(f'我是自定義的槽函數(shù):{msg}')


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

3、對于發(fā)送多種不同數(shù)據(jù)類型的事件

import sys
from PyQt5.Qt import *


class SignalObj(QObject):
  """
  定義一個信號的類
  """
  # 自定義一個信號,注意這個地方定義約束發(fā)送出去的參數(shù)類型,下面要一致
  sendMsg = pyqtSignal([str], [int])

  def __init__(self):
    super().__init__()

  def run(self):
    self.sendMsg[str].emit('hello')
    self.sendMsg[int].emit(999)


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('自定義事件')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按鈕', self)
    self.send = SignalObj()
    # 將事件與槽建立關(guān)聯(lián)(這個地方你要接收那個數(shù)據(jù)類型的事件)
    self.send.sendMsg[int].connect(self.slot_hand)
    self.init_ui()

  def init_ui(self):
    # 系統(tǒng)中自帶的事件與槽函數(shù)建立連接
    self.btn.clicked.connect(self.btn_hand)

  def btn_hand(self):
    self.send.run()

  @staticmethod
  def slot_hand(msg):
    print(f'我是自定義的槽函數(shù):{msg}')


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

四、使用裝飾器信號與槽

1、使用格式

@PyQt5.QtCore.pyqtSlot(參數(shù))
def on_發(fā)送者對象名稱_發(fā)射信號名稱(self,參數(shù)):
 pass

2、注意點(diǎn),使用裝飾器必須定義兩個東西

QMetaObject.connectSlotsByName(self)

給需要綁定事件的定義一個id(self.btn.setObjectName('名稱'))

3、按鈕的普通事件

...
class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('裝飾器信號與槽')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按鈕', self)
    self.init_ui()

  def init_ui(self):
    self.btn.clicked.connect(self.btn_hand)
    
  @staticmethod
  def btn_hand():
    print('使用connect點(diǎn)擊了按鈕')
...  

4、使用裝飾器后的事件

...
class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('裝飾器信號與槽')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按鈕', self)
    self.init_ui()
    # 要在加載組件后使用
    QMetaObject.connectSlotsByName(self)

  def init_ui(self):
  # 這個地方定義的名字直接在下面使用
    self.btn.setObjectName('btn')

  @pyqtSlot()
  def on_btn_clicked(self):
    print('使用裝飾器點(diǎn)擊了按鈕')
...

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中try用法、內(nèi)置異常類型與自定義異常類型拓展案例詳解

    Python中try用法、內(nèi)置異常類型與自定義異常類型拓展案例詳解

    在?Python?里,try?語句主要用于異常處理,其作用是捕獲并處理代碼運(yùn)行期間可能出現(xiàn)的異常,避免程序因異常而意外終止,這篇文章主要介紹了Python中try用法、內(nèi)置異常類型與自定義異常類型拓展,需要的朋友可以參考下
    2025-04-04
  • Python+Pytorch實(shí)戰(zhàn)之彩色圖片識別

    Python+Pytorch實(shí)戰(zhàn)之彩色圖片識別

    這篇文章主要為大家詳細(xì)介紹了如何利用Python+Pytorch實(shí)現(xiàn)彩色圖片識別功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-09-09
  • NumPy實(shí)現(xiàn)結(jié)構(gòu)化數(shù)組的示例代碼

    NumPy實(shí)現(xiàn)結(jié)構(gòu)化數(shù)組的示例代碼

    結(jié)構(gòu)化數(shù)組是 NumPy 中用于處理異質(zhì)數(shù)據(jù)的重要工具,通過定義復(fù)雜的數(shù)據(jù)類型,我們可以創(chuàng)建具有不同字段的數(shù)組,本文主要介紹了NumPy實(shí)現(xiàn)結(jié)構(gòu)化數(shù)組的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • python迭代器與生成器詳解

    python迭代器與生成器詳解

    迭代器和生成器都是Python中特有的概念,迭代器可以看作是一個特殊的對象,每次調(diào)用該對象時會返回自身的下一個元素,從實(shí)現(xiàn)上來看,一個可迭代的對象必須是定義了__iter__()方法的對象,而一個迭代器必須是定義了__iter__()方法和next()方法的對象。
    2016-03-03
  • openCV提取圖像中的矩形區(qū)域

    openCV提取圖像中的矩形區(qū)域

    這篇文章主要為大家詳細(xì)介紹了openCV提取圖像中的矩形區(qū)域,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 使用python-pptx包批量修改ppt格式的實(shí)現(xiàn)

    使用python-pptx包批量修改ppt格式的實(shí)現(xiàn)

    今天小編就為大家分享一篇使用python-pptx包批量修改ppt格式的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python傳到前端的數(shù)據(jù),雙引號被轉(zhuǎn)義的問題

    python傳到前端的數(shù)據(jù),雙引號被轉(zhuǎn)義的問題

    這篇文章主要介紹了python傳到前端的數(shù)據(jù),雙引號被轉(zhuǎn)義的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Windows下實(shí)現(xiàn)pytorch環(huán)境搭建

    Windows下實(shí)現(xiàn)pytorch環(huán)境搭建

    這篇文章主要介紹了Windows下實(shí)現(xiàn)pytorch環(huán)境搭建,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 使用基于Python的Tornado框架的HTTP客戶端的教程

    使用基于Python的Tornado框架的HTTP客戶端的教程

    這篇文章主要介紹了制作一個基于Python的Tornado框架的HTTP客戶端的教程,Tornado的異步特性使其能夠獲得很好的性能,需要的朋友可以參考下
    2015-04-04
  • python中yield的用法詳解

    python中yield的用法詳解

    這篇文章主要介紹了python中yield的用法詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01

最新評論

鸡西市| 崇州市| 林周县| 蕉岭县| 夏邑县| 凤山市| 吕梁市| 昆明市| 满洲里市| 沂南县| 屏边| 页游| 金寨县| 浦城县| 策勒县| 道孚县| 宁陵县| 沈丘县| 凤台县| 赤城县| 来宾市| 中江县| 兴国县| 漯河市| 阿图什市| 工布江达县| 冷水江市| 常宁市| 政和县| 新野县| 肃南| 攀枝花市| 巴彦县| 彩票| 三江| 拉孜县| 察雅县| 菏泽市| 灵璧县| 孙吴县| 九寨沟县|