国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:2日期:2022-08-03 11:55:55

在pyqt5編程過(guò)程中,經(jīng)常會(huì)遇到輸入或選擇多個(gè)參數(shù)的問(wèn)題,把多個(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è)置等,常見(jiàn)的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之間傳參數(shù)有兩種常用的方式,一種在自定義對(duì)話框之間通過(guò)屬性傳參,另一種在窗口之間使用信號(hào)與槽機(jī)制傳參,這里主要介紹第一種

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

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

import sysfrom 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)行效果如圖

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

多窗口數(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è)主窗口文件,用來(lái)調(diào)用上一個(gè)子窗口

import sysfrom PyQt5.QtGui import *from PyQt5.QtCore import *from PyQt5.QtWidgets import *from jia_13多窗口數(shù)據(jù)傳遞之調(diào)用屬性 import DateDialogclass 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)行程序,顯示如圖

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

代碼分析

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

第一中方法:直接在主窗口程序中實(shí)例化該對(duì)話框,然后調(diào)用該對(duì)話框的函數(shù),來(lái)獲取返回值,根據(jù)對(duì)話框的返回值單擊確認(rèn)按鈕還是取消按鈕來(lái)進(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í)際上這種方法與第一種方法是一樣的,只不過(guò)他利用靜態(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ù)傳遞,一般是通過(guò)子窗口發(fā)射信號(hào)的,主窗口通過(guò)槽函數(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(’子窗口:用來(lái)發(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 sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *from jia_14多窗口信號(hào)傳遞之信號(hào)與槽 import DateDialogclass 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)行程序,效果如下

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

代碼分析

下面代碼表示,當(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)鏈接

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产美女一级特黄毛片 | 一区二区三区国模大胆 | 国产精品人成 | 韩国一级毛片大全女教师 | 国产精品美女久久久久网站 | 在线一区二区观看 | 午夜在线播放免费人成无 | 国内精品久久久久久久久 | 精品久久久久久综合网 | 亚洲天堂中文网 | 成年美女黄网站色视频大全免费 | 网禁呦萝资源网站在线观看 | 亚洲成a人片在线观看中文!!! | 久久免费影院 | 男女无遮挡拍拍拍免费1000 | 欧美一及片 | 国产亚洲福利一区二区免费看 | 3d动漫精品成人一区二区三 | 在线成人毛片 | 久久久日本久久久久123 | 国产成人精品免费视频 | 色欧美在线| 欧美国产日韩一区二区三区 | 亚洲精品高清国产麻豆专区 | 一区二区三区 日韩 | 亚洲国产激情一区二区三区 | 在线中文字幕视频 | 国产伦子伦视频免费 | 欧美成人午夜 | 亚洲精品欧美精品国产精品 | 国产成人高清精品免费5388密 | 一本一道久久 | 亚洲在线播放视频 | 亚洲a级 | 亚洲国产成人最新精品资源 | videos欧美丰满肥婆 | 欧美成人中文字幕 | 一区二区三区视频免费观看 | 国产情侣久久精品 | 日本一区二区三区高清在线观看 | 日本高清色本在线www游戏 |