欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談pyqt5中信號(hào)與槽的認(rèn)識(shí)

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

一、介紹

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

在pyqt5中,每一個(gè)QObject對(duì)象和pyqt中所有繼承自QWidget的控件都支持信號(hào)和槽

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

在pyqt5中信號(hào)主要分兩類:

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

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

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

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))
...

三、自定義信號(hào)

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

import sys
from PyQt5.Qt import *


class SignalObj(QObject):
  """
  定義一個(gè)信號(hào)的類
  """
  # 自定義一個(gè)信號(hào)
  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、信號(hào)中發(fā)射出數(shù)據(jù)

import sys
from PyQt5.Qt import *


class SignalObj(QObject):
  """
  定義一個(gè)信號(hào)的類
  """
  # 自定義一個(gè)信號(hào),注意這個(gè)地方定義約束發(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、對(duì)于發(fā)送多種不同數(shù)據(jù)類型的事件

import sys
from PyQt5.Qt import *


class SignalObj(QObject):
  """
  定義一個(gè)信號(hào)的類
  """
  # 自定義一個(gè)信號(hào),注意這個(gè)地方定義約束發(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)(這個(gè)地方你要接收那個(gè)數(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_())

四、使用裝飾器信號(hào)與槽

1、使用格式

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

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

QMetaObject.connectSlotsByName(self)

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

3、按鈕的普通事件

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

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

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

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

相關(guān)文章

  • 基于Python繪制一個(gè)摸魚倒計(jì)時(shí)界面

    基于Python繪制一個(gè)摸魚倒計(jì)時(shí)界面

    前端時(shí)間推出了一個(gè)摸魚APP,這篇文章將為大家介紹基于Python繪制一個(gè)摸魚倒計(jì)時(shí)界面,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • 用python計(jì)算文件的MD5值

    用python計(jì)算文件的MD5值

    這篇文章主要介紹了用python計(jì)算文件的MD5值的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python中range、np.arange和np.linspace的區(qū)別

    Python中range、np.arange和np.linspace的區(qū)別

    本文主要介紹了Python中range、np.arange和np.linspace的區(qū)別,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python將多份excel表格整理成一份表格

    Python將多份excel表格整理成一份表格

    這篇文章主要為大家詳細(xì)介紹了Python將多份excel表格整理成一份表格,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式

    利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式

    今天小編就為大家分享一篇利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Flask學(xué)習(xí)之全局異常處理詳解

    Flask學(xué)習(xí)之全局異常處理詳解

    Flask是一個(gè)基于Python的Web框架,它提供了全局異常處理的機(jī)制來捕獲和處理應(yīng)用程序中的異常,下面就帶大家深入了解一下Flask是如何實(shí)現(xiàn)異常處理的,希望對(duì)大家有所幫助
    2023-06-06
  • python?set()去重的底層原理及實(shí)例

    python?set()去重的底層原理及實(shí)例

    python中集合set是一個(gè)無序不重復(fù)元素的集,基本功能包括關(guān)系測試和消除重復(fù)元素,還可以計(jì)算交集、差集、并集等,它與列表(list)的行為類似,這篇文章主要介紹了python?set()去重的底層原理,需要的朋友可以參考下
    2022-01-01
  • python函數(shù)的作用域及關(guān)鍵字詳解

    python函數(shù)的作用域及關(guān)鍵字詳解

    這篇文章主要介紹了python函數(shù)的作用域及關(guān)鍵字詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python繪制折線圖可視化神器pyecharts案例

    Python繪制折線圖可視化神器pyecharts案例

    這篇文章主要介紹了Python繪制折線圖可視化神器pyecharts,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Pytorch中torch.repeat_interleave()函數(shù)使用及說明

    Pytorch中torch.repeat_interleave()函數(shù)使用及說明

    這篇文章主要介紹了Pytorch中torch.repeat_interleave()函數(shù)使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論