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

python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽多窗口數(shù)據(jù)傳遞詳細(xì)使用方法與實(shí)例

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

在pyqt5編程過程中,經(jīng)常會(huì)遇到輸入或選擇多個(gè)參數(shù)的問題,把多個(gè)參數(shù)寫到一個(gè)窗口中,主窗口會(huì)顯得很臃腫,所以,一般是添加一個(gè)按鈕,調(diào)用對(duì)話框,在對(duì)話框中進(jìn)行參數(shù)的選擇,關(guān)閉對(duì)話框?qū)?shù)返回給主窗口

pyqt提供了一些標(biāo)準(zhǔn)的對(duì)話框類,用于輸入數(shù)據(jù),修改數(shù)據(jù),更改應(yīng)用的設(shè)置等,常見的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之間傳參數(shù)有兩種常用的方式,一種在自定義對(duì)話框之間通過屬性傳參,另一種在窗口之間使用信號(hào)與槽機(jī)制傳參,這里主要介紹第一種

單一窗口的數(shù)據(jù)傳遞實(shí)例

對(duì)于具有單一窗口的程序來說,一個(gè)控件的變化會(huì)影響另一個(gè)控件的變化,這中變化利用信號(hào)與槽的關(guān)系非常容易解決

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)
    #設(shè)置窗口布局
    self.setLayout(vbox)
    #設(shè)置滑塊數(shù)值信號(hào)改變連接Lcd的更新
    slider.valueChanged.connect(lcd.display)
    #設(shè)置初始位置以及初始大小,設(shè)置標(biāo)題
    self.setGeometry(300,300,350,150)
    self.setWindowTitle('信號(hào)與槽:連接滑塊LCd')
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=WinForm()
  form.show()
  sys.exit(app.exec_())

運(yùn)行效果如圖

多窗口數(shù)據(jù)傳遞:調(diào)用屬性

新建對(duì)話框子窗口屬性,我這里的名字為: jia_13多窗口數(shù)據(jù)傳遞之調(diào)用屬性

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)

再新建一個(gè)主窗口文件,用來調(diào)用上一個(gè)子窗口

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from jia_13多窗口數(shù)據(jù)傳遞之調(diào)用屬性 import DateDialog
class WinForm(QWidget):
  def __init__(self,parent=None):
    super(WinForm, self).__init__(parent)
    self.resize(400,90)
    self.setWindowTitle('對(duì)話框關(guān)閉時(shí)返回值給主窗口的例子')
    self.lineEdit=QLineEdit(self)
    self.button1=QPushButton('彈出對(duì)話框1')
    self.button1.clicked.connect(self.onButton1Clicked)
    self.button2=QPushButton('彈出對(duì)話框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日期對(duì)話框的返回值')
    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 日期對(duì)話框的返回值')
    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_())

運(yùn)行程序,顯示如圖

代碼分析

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

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

 def onButton1Clicked( self ):

        dialog=DateDialog(self)

        result=dialog.exec_()

        date=dialog.dateTime()

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

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

 def onButton2Clicked( self ):

        date,time,result=DateDialog.getDateTime()

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

多窗口數(shù)據(jù)傳遞信號(hào)與槽實(shí)例

對(duì)于多窗口的數(shù)據(jù)傳遞,一般是通過子窗口發(fā)射信號(hào)的,主窗口通過槽函數(shù)捕獲這個(gè)信號(hào),然后獲取信號(hào)里面的數(shù)據(jù),子窗口發(fā)射的信號(hào)有兩種:一種是發(fā)射內(nèi)置pyqt信號(hào),一種是發(fā)射自定義的信號(hào)

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

新建一個(gè)子對(duì)話框文件,這里的名稱為:jia_14多窗口信號(hào)傳遞之信號(hào)與槽

# -*- 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ā)射信號(hào)')
    # 在布局中添加部件
    layout = QVBoxLayout(self)
    self.label = QLabel(self)
    self.label.setText('前者發(fā)射內(nèi)置信號(hào)\n后者發(fā)射自定義信號(hào)')
    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)
    # 使用兩個(gè)button(ok和cancel)分別連接accept()和reject()槽函數(shù)
    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)建主窗口,調(diào)用對(duì)話框文件

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from jia_14多窗口信號(hào)傳遞之信號(hào)與槽 import DateDialog
class WinForm(QWidget):
  def __init__(self, parent=None):
    super(WinForm, self).__init__(parent)
    self.resize(400, 90)
    self.setWindowTitle('信號(hào)與槽傳遞參數(shù)的示例')
    self.open_btn = QPushButton('獲取時(shí)間')
    self.lineEdit_inner = QLineEdit(self)
    self.lineEdit_emit = QLineEdit(self)
    self.open_btn.clicked.connect(self.openDialog)
    self.lineEdit_inner.setText('接收子窗口內(nèi)置信號(hào)的時(shí)間')
    self.lineEdit_emit.setText('接收子窗口自定義信號(hào)的時(shí)間')
    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)
    '''連接子窗口的內(nèi)置信號(hào)與主窗口的槽函數(shù)'''
    dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)
    '''連接子窗口的自定義信號(hào)與主窗口的槽函數(shù)'''
    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_())

運(yùn)行程序,效果如下

代碼分析

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

    def emit_signal(self):

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

        self.Signal_OneParameter.emit(date_str)

對(duì)于主窗口,關(guān)鍵是獲取子窗口的信號(hào),并把它綁定在自己的槽函數(shù)上,這樣就實(shí)現(xiàn)了子窗口的控件與主窗口控件的綁定,核心代碼如下

  def openDialog(self):

        dialog = DateDialog(self)

        '''連接子窗口的內(nèi)置信號(hào)與主窗口的槽函數(shù)'''

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

        '''連接子窗口的自定義信號(hào)與主窗口的槽函數(shù)'''

        dialog.Signal_OneParameter.connect(self.deal_emit_slot)

        dialog.show()

本文主要講解了PyQt5窗口數(shù)據(jù)傳遞與PyQt5信號(hào)與槽多窗口數(shù)據(jù)傳遞詳細(xì)使用方法與實(shí)例,更多關(guān)于PyQt5信號(hào)與槽的知識(shí)請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • Deepsort + Yolo 實(shí)現(xiàn)行人檢測和軌跡追蹤的方法

    Deepsort + Yolo 實(shí)現(xiàn)行人檢測和軌跡追蹤的方法

    這篇文章主要介紹了Deepsort + Yolo 實(shí)現(xiàn)行人檢測和軌跡追蹤,本項(xiàng)目通過采用深度學(xué)習(xí)方法實(shí)現(xiàn)YOLO算法行人檢測和deepsort算法對(duì)人員定位的和軌跡跟蹤,需要的朋友可以參考下
    2021-09-09
  • django 模型字段設(shè)置默認(rèn)值代碼

    django 模型字段設(shè)置默認(rèn)值代碼

    這篇文章主要介紹了django 模型字段設(shè)置默認(rèn)值代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 用?Python?腳本實(shí)現(xiàn)電腦喚醒后自動(dòng)拍照并截屏發(fā)郵件通知

    用?Python?腳本實(shí)現(xiàn)電腦喚醒后自動(dòng)拍照并截屏發(fā)郵件通知

    這篇文章主要介紹了用?Python?腳本實(shí)現(xiàn)電腦喚醒后自動(dòng)拍照并截屏發(fā)郵件通知,文中詳細(xì)的介紹了代碼示例,具有一定的 參考價(jià)值,感興趣的可以了解一下
    2023-03-03
  • Python中eval帶來的潛在風(fēng)險(xiǎn)代碼分析

    Python中eval帶來的潛在風(fēng)險(xiǎn)代碼分析

    這篇文章主要介紹了Python中eval帶來的潛在風(fēng)險(xiǎn)代碼分析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Python入門教程(四十三)Python的NumPy數(shù)據(jù)類型

    Python入門教程(四十三)Python的NumPy數(shù)據(jù)類型

    這篇文章主要介紹了Python入門教程(四十二)Python的NumPy數(shù)組裁切,NumPy有一些額外的數(shù)據(jù)類型,并通過一個(gè)字符引用數(shù)據(jù)類型,例如 i 代表整數(shù),u 代表無符號(hào)整數(shù)等,需要的朋友可以參考下
    2023-05-05
  • Python使用pydub實(shí)現(xiàn)M4A轉(zhuǎn)MP3轉(zhuǎn)換器

    Python使用pydub實(shí)現(xiàn)M4A轉(zhuǎn)MP3轉(zhuǎn)換器

    這篇文章主要介紹了如何使用?wxPython?創(chuàng)建一個(gè)圖形用戶界面(GUI)應(yīng)用程序,能夠?qū)?.m4a?文件轉(zhuǎn)換為?.mp3?文件,感興趣的可以了解下
    2024-11-11
  • Python3實(shí)現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作示例

    Python3實(shí)現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作示例

    這篇文章主要介紹了Python3實(shí)現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作,涉及Python正則爬取數(shù)據(jù)及針對(duì)mysql數(shù)據(jù)庫的存儲(chǔ)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-06-06
  • 零基礎(chǔ)使用Python讀寫處理Excel表格的方法

    零基礎(chǔ)使用Python讀寫處理Excel表格的方法

    這篇文章主要介紹了Python讀寫處理Excel表格,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 最新評(píng)論

    石景山区| 上饶县| 九龙坡区| 库尔勒市| 龙川县| 汝阳县| 深水埗区| 揭东县| 广德县| 怀柔区| 广河县| 老河口市| 涿鹿县| 雷波县| 千阳县| 竹溪县| 永州市| 阳江市| 重庆市| 井陉县| 准格尔旗| 建德市| 宿州市| 吉水县| 项城市| 聊城市| 邯郸市| 得荣县| 海南省| 杭锦后旗| 翁牛特旗| 柳州市| 农安县| 潼关县| 庆安县| 辰溪县| 双江| 莒南县| 肃南| 方山县| 铅山县|