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

python GUI庫圖形界面開發(fā)之PyQt5信號與槽多窗口數據傳遞詳細使用方法與實例

 更新時間:2020年03月08日 14:17:54   作者:jia666666  
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號與槽多窗口數據傳遞詳細使用方法與實例,需要的朋友可以參考下

在pyqt5編程過程中,經常會遇到輸入或選擇多個參數的問題,把多個參數寫到一個窗口中,主窗口會顯得很臃腫,所以,一般是添加一個按鈕,調用對話框,在對話框中進行參數的選擇,關閉對話框將參數返回給主窗口

pyqt提供了一些標準的對話框類,用于輸入數據,修改數據,更改應用的設置等,常見的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之間傳參數有兩種常用的方式,一種在自定義對話框之間通過屬性傳參,另一種在窗口之間使用信號與槽機制傳參,這里主要介紹第一種

單一窗口的數據傳遞實例

對于具有單一窗口的程序來說,一個控件的變化會影響另一個控件的變化,這中變化利用信號與槽的關系非常容易解決

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class WinForm(QWidget):
  def __init__(self):
    super(WinForm, self).__init__()
    self.initUI()
  def initUI( self ):
    #先創(chuàng)建水平滑塊和Lcd控件
    lcd=QLCDNumber(self)
    slider=QSlider(Qt.Horizontal,self)
    #垂直布局,添加控件
    vbox=QVBoxLayout()
    vbox.addWidget(lcd)
    vbox.addWidget(slider)
    #設置窗口布局
    self.setLayout(vbox)
    #設置滑塊數值信號改變連接Lcd的更新
    slider.valueChanged.connect(lcd.display)
    #設置初始位置以及初始大小,設置標題
    self.setGeometry(300,300,350,150)
    self.setWindowTitle('信號與槽:連接滑塊LCd')
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=WinForm()
  form.show()
  sys.exit(app.exec_())

運行效果如圖

多窗口數據傳遞:調用屬性

新建對話框子窗口屬性,我這里的名字為: jia_13多窗口數據傳遞之調用屬性

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
  def __init__(self,parent=None):
    super(DateDialog, self).__init__(parent)
    self.setWindowTitle('DateDialog')
    #在布局中添加控件
    layout=QVBoxLayout(self)
    self.datetime=QDateTimeEdit(self)
    self.datetime.setCalendarPopup(True)
    self.datetime.setDateTime(QDateTime.currentDateTime())
    layout.addWidget(self.datetime)
    buttons=QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel,Qt.Horizontal,self)
    buttons.accepted.connect(self.accept)
    buttons.rejected.connect(self.reject)
    layout.addWidget(buttons)
  def dateTime( self ):
    return self.datetime.dateTime()
  @staticmethod
  def getDateTime(parent=None):
    dialog=DateDialog(parent)
    result=dialog.exec_()
    date=dialog.dateTime()
    return (date.date(),date.time(),result==QDialog.Accepted)

再新建一個主窗口文件,用來調用上一個子窗口

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from jia_13多窗口數據傳遞之調用屬性 import DateDialog
class WinForm(QWidget):
  def __init__(self,parent=None):
    super(WinForm, self).__init__(parent)
    self.resize(400,90)
    self.setWindowTitle('對話框關閉時返回值給主窗口的例子')
    self.lineEdit=QLineEdit(self)
    self.button1=QPushButton('彈出對話框1')
    self.button1.clicked.connect(self.onButton1Clicked)
    self.button2=QPushButton('彈出對話框2')
    self.button2.clicked.connect(self.onButton2Clicked)
    gridLayout=QGridLayout(self)
    gridLayout.addWidget(self.lineEdit)
    gridLayout.addWidget(self.button1)
    gridLayout.addWidget(self.button2)
  def onButton1Clicked( self ):
    dialog=DateDialog(self)
    result=dialog.exec_()
    date=dialog.dateTime()
    self.lineEdit.setText(date.date().toString())
    print('\n日期對話框的返回值')
    print('date=%s'%str(date.date))
    print('time=%s'%str(date.time()))
    print('result=%s'%result)
  def onButton2Clicked( self ):
    date,time,result=DateDialog.getDateTime()
    self.lineEdit.setText(date.toString())
    print('\n 日期對話框的返回值')
    print('date=%s' %str(date))
    print('time=%s' %str(time))
    print('result=%s' %result)
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=WinForm()
  form.show()
  sys.exit(app.exec_())

運行程序,顯示如圖

代碼分析

在主窗口調用對話框有兩種方法,本例中,這兩種方法操作效果是一樣的,都需要點擊彈出對話框按鈕,在對話框的時間日期控件中選擇日期,則會把選中的日期返回到主窗口的lineTeXt文本控件中

第一中方法:直接在主窗口程序中實例化該對話框,然后調用該對話框的函數,來獲取返回值,根據對話框的返回值單擊確認按鈕還是取消按鈕來進行下一步的操作,同理,對于上面的DateDialog,主窗口程序代碼如下

 def onButton1Clicked( self ):

        dialog=DateDialog(self)

        result=dialog.exec_()

        date=dialog.dateTime()

        self.lineEdit.setText(date.date().toString())

第二種方法:在主窗口程序中調用子窗口的靜態(tài)函數,實際上這種方法與第一種方法是一樣的,只不過他利用靜態(tài)函數的特點,在子窗口的靜態(tài)函數中的創(chuàng)建實例化對象

 def onButton2Clicked( self ):

        date,time,result=DateDialog.getDateTime()

        self.lineEdit.setText(date.toString())

多窗口數據傳遞信號與槽實例

對于多窗口的數據傳遞,一般是通過子窗口發(fā)射信號的,主窗口通過槽函數捕獲這個信號,然后獲取信號里面的數據,子窗口發(fā)射的信號有兩種:一種是發(fā)射內置pyqt信號,一種是發(fā)射自定義的信號

發(fā)射自定義的信號,好處是它的參數可以自定義,可以為int list dict等各種類型與多個參數

新建一個子對話框文件,這里的名稱為:jia_14多窗口信號傳遞之信號與槽

# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
  Signal_OneParameter = pyqtSignal(str)
  def __init__(self, parent=None):
    super(DateDialog, self).__init__(parent)
    self.setWindowTitle('子窗口:用來發(fā)射信號')
    # 在布局中添加部件
    layout = QVBoxLayout(self)
    self.label = QLabel(self)
    self.label.setText('前者發(fā)射內置信號\n后者發(fā)射自定義信號')
    self.datetime_inner = QDateTimeEdit(self)
    self.datetime_inner.setCalendarPopup(True)
    self.datetime_inner.setDateTime(QDateTime.currentDateTime())
    self.datetime_emit = QDateTimeEdit(self)
    self.datetime_emit.setCalendarPopup(True)
    self.datetime_emit.setDateTime(QDateTime.currentDateTime())
    layout.addWidget(self.label)
    layout.addWidget(self.datetime_inner)
    layout.addWidget(self.datetime_emit)
    # 使用兩個button(ok和cancel)分別連接accept()和reject()槽函數
    buttons = QDialogButtonBox(
      QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
      Qt.Horizontal, self)
    buttons.accepted.connect(self.accept)
    buttons.rejected.connect(self.reject)
    layout.addWidget(buttons)
    self.datetime_emit.dateTimeChanged.connect(self.emit_signal)
  def emit_signal(self):
    date_str = self.datetime_emit.dateTime().toString()
    self.Signal_OneParameter.emit(date_str)

創(chuàng)建主窗口,調用對話框文件

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from jia_14多窗口信號傳遞之信號與槽 import DateDialog
class WinForm(QWidget):
  def __init__(self, parent=None):
    super(WinForm, self).__init__(parent)
    self.resize(400, 90)
    self.setWindowTitle('信號與槽傳遞參數的示例')
    self.open_btn = QPushButton('獲取時間')
    self.lineEdit_inner = QLineEdit(self)
    self.lineEdit_emit = QLineEdit(self)
    self.open_btn.clicked.connect(self.openDialog)
    self.lineEdit_inner.setText('接收子窗口內置信號的時間')
    self.lineEdit_emit.setText('接收子窗口自定義信號的時間')
    grid = QGridLayout()
    grid.addWidget(self.lineEdit_inner)
    grid.addWidget(self.lineEdit_emit)
    grid.addWidget(self.open_btn)
    self.setLayout(grid)
  def openDialog(self):
    dialog = DateDialog(self)
    '''連接子窗口的內置信號與主窗口的槽函數'''
    dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)
    '''連接子窗口的自定義信號與主窗口的槽函數'''
    dialog.Signal_OneParameter.connect(self.deal_emit_slot)
    dialog.show()
  def deal_inner_slot(self, date):
    self.lineEdit_inner.setText(date.toString())
  def deal_emit_slot(self, dateStr):
    self.lineEdit_emit.setText(dateStr)
if __name__ == "__main__":
  app = QApplication(sys.argv)
  form = WinForm()
  form.show()
  sys.exit(app.exec_())

運行程序,效果如下

代碼分析

下面代碼表示,當空間datetime_emit的時間發(fā)生變化時,就會觸發(fā),子窗口的槽函數emit_signal,而在這個槽函數中又會發(fā)射自定義信號Signal_OneParameter,這個信號函數是為了傳遞date_str參數給主函數

    def emit_signal(self):

        date_str = self.datetime_emit.dateTime().toString()

        self.Signal_OneParameter.emit(date_str)

對于主窗口,關鍵是獲取子窗口的信號,并把它綁定在自己的槽函數上,這樣就實現了子窗口的控件與主窗口控件的綁定,核心代碼如下

  def openDialog(self):

        dialog = DateDialog(self)

        '''連接子窗口的內置信號與主窗口的槽函數'''

        dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)

        '''連接子窗口的自定義信號與主窗口的槽函數'''

        dialog.Signal_OneParameter.connect(self.deal_emit_slot)

        dialog.show()

本文主要講解了PyQt5窗口數據傳遞與PyQt5信號與槽多窗口數據傳遞詳細使用方法與實例,更多關于PyQt5信號與槽的知識請查看下面的相關鏈接

相關文章

  • 關于命令行執(zhí)行Python腳本的傳參方式

    關于命令行執(zhí)行Python腳本的傳參方式

    這篇文章主要介紹了關于命令行執(zhí)行Python腳本的傳參方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Python數據結構之二叉排序樹的定義、查找、插入、構造、刪除

    Python數據結構之二叉排序樹的定義、查找、插入、構造、刪除

    這篇文章主要給大家介紹了關于Python數據結構之二叉排序樹應用的相關資料,二叉排序樹又稱為二叉查找樹,它或者是一顆空樹,或者是具有下列性質的二叉樹,需要的朋友可以參考下
    2021-06-06
  • python自動生成sql語句的腳本

    python自動生成sql語句的腳本

    這篇文章主要介紹了python自動生成sql語句的腳本,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Pytorch建模過程中的DataLoader與Dataset示例詳解

    Pytorch建模過程中的DataLoader與Dataset示例詳解

    這篇文章主要介紹了Pytorch建模過程中的DataLoader與Dataset,同時PyTorch針對不同的專業(yè)領域,也提供有不同的模塊,例如?TorchText,?TorchVision,?TorchAudio,這些模塊中也都包含一些真實數據集示例,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2023-01-01
  • 使用Flask開發(fā)RESTful?API的方法實現

    使用Flask開發(fā)RESTful?API的方法實現

    RESTful?API是一種基于REST架構風格設計的Web服務接口,本文主要介紹了使用Flask開發(fā)RESTful?API的方法實現,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 詳解Python 正則表達式模塊

    詳解Python 正則表達式模塊

    這篇文章主要介紹了Python 正則表達式模塊詳解,分為兩部分,包括基礎語法總結,re模塊的相關知識,需要的朋友可以參考下
    2018-11-11
  • Python matplotlib超詳細教程實現圖形繪制

    Python matplotlib超詳細教程實現圖形繪制

    matplotlib 模塊不僅提供了繪制統(tǒng)計圖表的功能,還支持繪制圓形、正方形、矩形等各種圖形。這篇文章主要為大家詳細介紹了利用matplotlib.patches 繪制一些基本圖形,快來跟隨小編一起學習吧
    2021-12-12
  • python3.4用函數操作mysql5.7數據庫

    python3.4用函數操作mysql5.7數據庫

    這篇文章主要為大家詳細介紹了python3.4用函數操作mysql5.7數據庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 520必備!這些Python表白代碼祝你脫單成功

    520必備!這些Python表白代碼祝你脫單成功

    不會還有程序猿沒有女朋友吧?沒關系,今天特地為大家整理了這些Python花式表白代碼,你就放心大膽的去吧,需要的朋友可以參考下
    2021-05-05
  • 利用Python編寫個冷笑話生成器

    利用Python編寫個冷笑話生成器

    這篇文章主要為大家分享了如何利用Python編寫一個簡易的冷笑話生成器,這樣再惹女朋友生氣,就可以說笑話哄她啦,快跟隨小編一起學習一下
    2022-04-04

最新評論