成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python GUI庫圖形界面開發(fā)之PyQt5信號與槽機制、自定義信號基礎介紹

瀏覽:13日期:2022-08-06 13:31:12

信號和槽機制是 QT 的核心機制,要精通 QT 編程就必須對信號和槽有所了解。信號和槽是一種高級接口,應用于對象之間的通信,它是 QT 的核心特性,也是 QT 區(qū)別于其它工具包的重要地方。

在linux、windows等 GUI 工具包中,GUI組件都會注冊回調(diào)函數(shù)用于處理組件所觸發(fā)的動作,通常是注冊對應的函數(shù)的函數(shù)指針。在之前關于Button的文章中提到了信號與槽的機制的使用,通過該機制可以很好的將組件的信號(如button的clocked、toggled、pressed等)和處理該信號的槽關聯(lián)起來。通過 信號與槽機制,能夠讓我們很簡潔和快速的來完成相關的功能。

信號和槽是用來在對象間傳遞數(shù)據(jù)的方法:當一個特定事件發(fā)生的時候,signal會被emit出來,slot調(diào)用是用來響應相應的signal的。Qt中對象已經(jīng)包含了許多預定義的 signal(基本組件都有各自特有的預定義的信號),根據(jù)使用的場景我們可以添加新的signal。Qt的對象中已經(jīng)包含了許多預定義的槽函數(shù),但我們也根據(jù)使用的場景添加新的槽函數(shù)。

信號

當對象的狀態(tài)發(fā)生改變的時候,信號就由該對象發(fā)射 (emit) 出去。當一個信號被發(fā)射(emit)時候,與其關聯(lián)的槽函數(shù)被立刻執(zhí)行。其中該對象只負責發(fā)送信號,發(fā)射該信號的對象并不知道是那個對象在接收這個信號。這樣保證了對象與對象之間的低耦合。

如果存在信號和多個槽函數(shù)相關聯(lián)的時候,當信號被發(fā)射時,這些槽的執(zhí)行順序?qū)请S機的、不確定的。

用于接受信號,而且槽只是普通的對象成員函數(shù)。當和槽連接的信號被發(fā)射時,槽會被調(diào)用。一個槽并不知道是否有任何信號與自己相連接。

信號和槽的綁定

通過調(diào)用 QObject 對象的 connect 函數(shù)來將某個對象的信號與另外一個對象的槽函數(shù)相關聯(lián),這樣當發(fā)射者發(fā)射信號時,接收者的槽函數(shù)將被調(diào)用。該函數(shù)的定義如下::

connect(slot[, type=PyQt5.QtCore.Qt.AutoConnection[, no_receiver_check=False]])

Parameters: 

slot ? the slot to connect to, either a Python callable or another bound signal.

type ? the type of the connection to make.

no_receiver_check ? suppress the check that the underlying C++ receiver instance still exists and deliver the signal anyway.

當信號與槽沒有必要繼續(xù)保持關聯(lián)時,我們可以使用 disconnect 函數(shù)來斷開連接。其定義如下:

disconnect([slot])

Parameters: slot ? the optional slot to disconnect from, either a Python callable or another bound signal. If it is omitted then all slots connected to the signal are disconnected.

信號和槽的特點1、一個信號可以連接到多個槽;

當信號發(fā)出后,槽函數(shù)都會被調(diào)用,但是調(diào)用的順序是隨機的,不確定的。

self.slider.valueChanged.connect(self.pBar.setValue) 

self.slider.valueChanged.connect(self.lcdNumber.display)

QSlider數(shù)據(jù)的變化同時綁定在setValue()和display()兩個槽上。

2、多個信號可以連接到同一個槽;

其中任何一個信號發(fā)出,槽函數(shù)都會被執(zhí)行。

self.buttonOn.clicked.connect(self.showMessage)

self.buttonOff.clicked.connect(self.showMessage)

showMessage()同時綁定在兩個button的clicked信號上

3、信號的參數(shù)可以是任何的Python類型;

如list,dict等python獨有的類型。自定義信號的時候舉例說明。

4、信號和槽的連接可以被移除;

比如斷開某個特定信號的關聯(lián)。

self.buttonOn.clicked.connect(self.showMessage)

5、信號可以和另外一個信號進行關聯(lián);

第一個信號發(fā)出后,第二個信號也同時發(fā)送。比如關閉系統(tǒng)的信號發(fā)出之后,同時會發(fā)出保存數(shù)據(jù)的信號。

代碼示例:

關于信號和槽的式樣代碼如下:

#-*- coding:utf-8 -*-’’’Signal & Slot’’’__author__ = ’Tony Zhu’import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,QGridLayout,QLabel,QHBoxLayout, QGroupBox, QVBoxLayout, QApplication,QProgressBar,QPushButton,QMessageBox)class SignalSlot(QWidget): def __init__(self): super(SignalSlot,self).__init__() self.initUI() def initUI(self): self.controlsGroup = QGroupBox('運行樣本') self.lcdNumber = QLCDNumber(self) self.slider = QSlider(Qt.Horizontal, self) self.pBar = QProgressBar(self) vbox = QVBoxLayout() vbox.addWidget(self.pBar) vbox.addWidget(self.lcdNumber) vbox.addWidget(self.slider) self.controlsGroup.setLayout(vbox) controlsLayout = QGridLayout() self.label1 = QLabel('保存狀態(tài):') self.saveLabel = QLabel() self.label2 = QLabel('運行狀態(tài):') self.runLabel = QLabel() self.buttonSave = QPushButton('保存') self.buttonRun = QPushButton('運行') self.buttonStop = QPushButton('停止') self.buttonDisconnect = QPushButton('解除關聯(lián)') self.buttonConnect = QPushButton('綁定關聯(lián)') controlsLayout.addWidget(self.label1,0,0) controlsLayout.addWidget(self.saveLabel,0,1) controlsLayout.addWidget(self.label2,1,0) controlsLayout.addWidget(self.runLabel,1,1) controlsLayout.addWidget(self.buttonSave,2,0) controlsLayout.addWidget(self.buttonRun,2,1) controlsLayout.addWidget(self.buttonStop,2,2) controlsLayout.addWidget(self.buttonDisconnect,3,0) controlsLayout.addWidget(self.buttonConnect,3,1) layout = QHBoxLayout() layout.addWidget(self.controlsGroup) layout.addLayout(controlsLayout) self.setLayout(layout) self.buttonRun.clicked.connect(self.buttonSave.clicked) self.slider.valueChanged.connect(self.pBar.setValue) self.slider.valueChanged.connect(self.lcdNumber.display) self.buttonSave.clicked.connect(self.showMessage) self.buttonRun.clicked.connect(self.showMessage) self.buttonDisconnect.clicked.connect(self.unbindConnection) self.buttonConnect.clicked.connect(self.bindConnection) self.buttonStop.clicked.connect(self.stop) self.setGeometry(300, 500, 500, 180) self.setWindowTitle(’信號和槽’) def showMessage(self): if self.sender().text() == '保存': self.saveLabel.setText('Saved') elif self.sender().text() == '運行': self.saveLabel.setText('Saved') self.runLabel.setText('Running') def unbindConnection(self): self.slider.valueChanged.disconnect() def bindConnection(self): self.slider.valueChanged.connect(self.pBar.setValue) self.slider.valueChanged.connect(self.lcdNumber.display) def stop(self): self.saveLabel.setText('') self.runLabel.setText('')if __name__ == ’__main__’: app = QApplication(sys.argv) ex = SignalSlot() ex.show() sys.exit(app.exec_())

程序運行的結果:

python GUI庫圖形界面開發(fā)之PyQt5信號與槽機制、自定義信號基礎介紹

控件說明:

控件類型 控件名稱 作用 QLCDNumber lcdNumber 顯示slider滑動之后的數(shù)據(jù) QProgressBar pBar 顯示slider滑動之后的數(shù)據(jù)(百分比數(shù)據(jù)) QSlider slider 滑動塊調(diào)整數(shù)據(jù) QPushButton buttonSave 在saveLabel顯示保存的狀態(tài)”Saved” QPushButton buttonRun 在runLabel顯示運行的狀態(tài)”Running” QPushButton buttonDisconnect 解除slider.valueChanged信號的綁定 QPushButton buttonConnect 連接slider.valueChanged信號的綁定 QPushButton buttonStop 清除saveLabel和runLabel的信息

示例說明:

程序樣本運行的界面邏輯,先設定運行的程序樣本數(shù)量,然后先保存后運行的邏輯狀態(tài)。通過slider的滑動來改變progressBar和LCD的顯示數(shù)據(jù);“保存”按鈕保存運行的樣本;“運行”按鈕運行程序樣本;“解除關聯(lián)”解除slider.valueChanged信號的綁定,此時slider的滑動,不會改變progressBar和LCD的顯示

示例說明:

L22~30:

self.controlsGroup = QGroupBox('運行樣本')self.lcdNumber = QLCDNumber(self)self.slider = QSlider(Qt.Horizontal, self)self.pBar = QProgressBar(self)vbox = QVBoxLayout()vbox.addWidget(self.pBar)vbox.addWidget(self.lcdNumber)vbox.addWidget(self.slider)self.controlsGroup.setLayout(vbox)

實例化一個QGroupBox,在其中添加QSlider,QProgressBar,QLCDNumber控件。

L32~41:

controlsLayout = QGridLayout()self.label1 = QLabel('保存狀態(tài):').....self.buttonDisconnect = QPushButton('解除關聯(lián)')self.buttonConnect = QPushButton('綁定關聯(lián)')

實例化,界面中右半部分的控件。

L58~65:

self.buttonRun.clicked.connect(self.buttonSave.clicked)self.slider.valueChanged.connect(self.pBar.setValue)self.slider.valueChanged.connect(self.lcdNumber.display)self.buttonSave.clicked.connect(self.showMessage)self.buttonRun.clicked.connect(self.showMessage)self.buttonDisconnect.clicked.connect(self.unbindConnection)self.buttonConnect.clicked.connect(self.bindConnection)self.buttonStop.clicked.connect(self.stop)signal和slot進行綁定。1、一個信號綁定多個槽:

self.slider.valueChanged.connect(self.pBar.setValue)

self.slider.valueChanged.connect(self.lcdNumber.display)

slider控件的valueChanged信號,同時與QProgressBar的setValue(),QLCDNumber的display()槽函數(shù)綁定,當valueChanged信號觸發(fā)的時候,這兩個槽函數(shù)均會被調(diào)用。

2、多個信號綁定到一個槽:

self.buttonSave.clicked.connect(self.showMessage)

self.buttonRun.clicked.connect(self.showMessage)

buttonSave和buttonRun這兩個對象的clicked信號,同時綁定到showMessage()這個槽函數(shù)。無論哪一個信號被觸發(fā),showMessage()這個槽函數(shù)均會被調(diào)用。

3、信號和槽的連接可以被移除:

self.buttonDisconnect.clicked.connect(self.unbindConnection)

當buttonDisconnect信號觸發(fā)之后,與其關聯(lián)的槽函數(shù)unbindConnection()中就會執(zhí)行disconnect()方法,如下:

def unbindConnection(self):self.slider.valueChanged.disconnect()

其中執(zhí)行disconnect()的時候可以指定解除與某個特定的slot槽的關聯(lián),比如self.slider.valueChanged.disconnect(self.pBar.setValue),此時解除和QProgressBar的setValue()的關聯(lián);或者不指定,在不指定slot的場景下這樣將解除和這個信號所有關聯(lián)的槽。

4、信號與信號的關聯(lián):

self.buttonRun.clicked.connect(self.buttonSave.clicked)

在示例說明中提到,在運行之前要對樣本進行保存,所以為了保證運行的時候執(zhí)行了保存的操作,所以將buttonRun.clicked信號和buttonSave.clicked信號關聯(lián)起來。

示例中在沒有執(zhí)行“保存”(buttonSave)的時候,執(zhí)行“運行”(buttonRun),此時由于兩個對象的clicked信號已經(jīng)關聯(lián),所以buttonSave的clicked同樣會執(zhí)行。

PyQt5自定義信號

PyQt5已經(jīng)自動定義了很多QT內(nèi)建的信號。但是在實際的使用中為了靈活使用信號與槽機制,我們可以根據(jù)需要自定義signal。可以使用pyqtSignal()方法定義新的信號,新的信號作為類的屬性。

自定義signal說明:

pyqtSignal()方法原型(PyQt官網(wǎng)的定義):

PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]])

Create one or more overloaded unbound signals as a class attribute.

Parameters: 

types ? the types that define the C++ signature of the signal. Each type may be a Python type object or a string that is the name of a C++ type. Alternatively each may be a sequence of type arguments. In this case each sequence defines the signature of a different signal overload. The first overload will be the default.

name ? the name of the signal. If it is omitted then the name of the class attribute is used. This may only be given as a keyword argument.

revision ? the revision of the signal that is exported to QML. This may only be given as a keyword argument.

arguments ? the sequence of the names of the signal’s arguments that is exported to QML. This may only be given as a keyword argument.

Return type:    an unbound signal

新的信號應該定義在QObject的子類中。新的信號必須作為定義類的一部分,不允許將信號作為類的屬性在類定義之后通過動態(tài)的方式進行添加。通過這種方式新的信號才能自動的添加到QMetaObject類中。這就意味這新定義的信號將會出現(xiàn)在Qt Designer,并且可以通過QMetaObject API實現(xiàn)內(nèi)省。

通過下面的例子,了解一下關于signal的定義:

from PyQt5.QtCore import QObject, pyqtSignalclass NewSignal(QObject): # 定義了一個“closed”信號,該信號沒有參數(shù)據(jù) closed= pyqtSignal() # 定義了一個'range_changed'信號,該信號有兩個int類型的參數(shù) range_changed = pyqtSignal(int, int, name=’rangeChanged’)

自定義信號的發(fā)射,通過emit()方法類實現(xiàn),具體參見該函數(shù)的原型:

emit(*args)

Parameters: args ? the optional sequence of arguments to pass to any connected slots.

通過下面的例子,了解一下關于emit()的使用:

from PyQt5.QtCore import QObject, pyqtSignalclass NewSignal(QObject): # 一個valueChanged的信號,該信號沒有參數(shù). valueChanged = pyqtSignal() def connect_and_emit_valueChanged(self): # 綁定信號和槽函數(shù) self.valueChanged.connect(self.handle_valueChanged) # 發(fā)射信號. self.trigger.emit() def handle_valueChanged(self): print('trigger signal received')

示例說明:

自定義信號的一般流程如下:

定義信號 定義槽函數(shù) 綁定信號和槽 發(fā)射信號

通過代碼示例來了解一下信號的自定義過程:

#-*- coding:utf-8 -*-’’’defined Signal’’’__author__ = ’Tony Zhu’import sysfrom PyQt5.QtCore import pyqtSignal, QObject, Qt, pyqtSlotfrom PyQt5.QtWidgets import QWidget, QApplication, QGroupBox, QPushButton, QLabel, QCheckBox, QSpinBox, QHBoxLayout, QComboBox, QGridLayoutclass SignalEmit(QWidget): helpSignal = pyqtSignal(str) printSignal = pyqtSignal(list) #聲明一個多重載版本的信號,包括了一個帶int和str類型參數(shù)的信號,以及帶str參數(shù)的信號 previewSignal = pyqtSignal([int,str],[str]) def __init__(self): super().__init__()self.initUI() def initUI(self): self.creatContorls('打印控制:') self.creatResult('操作結果:') layout = QHBoxLayout() layout.addWidget(self.controlsGroup) layout.addWidget(self.resultGroup) self.setLayout(layout) self.helpSignal.connect(self.showHelpMessage) self.printSignal.connect(self.printPaper) self.previewSignal[str].connect(self.previewPaper) self.previewSignal[int,str].connect(self.previewPaperWithArgs) self.printButton.clicked.connect(self.emitPrintSignal) self.previewButton.clicked.connect(self.emitPreviewSignal) self.setGeometry(300, 300, 290, 150) self.setWindowTitle(’defined signal’) self.show() def creatContorls(self,title): self.controlsGroup = QGroupBox(title) self.printButton = QPushButton('打印') self.previewButton = QPushButton('預覽') numberLabel = QLabel('打印份數(shù):') pageLabel = QLabel('紙張類型:') self.previewStatus = QCheckBox('全屏預覽') self.numberSpinBox = QSpinBox() self.numberSpinBox.setRange(1, 100) self.styleCombo = QComboBox(self) self.styleCombo.addItem('A4') self.styleCombo.addItem('A5') controlsLayout = QGridLayout() controlsLayout.addWidget(numberLabel, 0, 0) controlsLayout.addWidget(self.numberSpinBox, 0, 1) controlsLayout.addWidget(pageLabel, 0, 2) controlsLayout.addWidget(self.styleCombo, 0, 3) controlsLayout.addWidget(self.printButton, 0, 4) controlsLayout.addWidget(self.previewStatus, 3, 0) controlsLayout.addWidget(self.previewButton, 3, 1) self.controlsGroup.setLayout(controlsLayout) def creatResult(self,title): self.resultGroup = QGroupBox(title) self.resultLabel = QLabel('') layout = QHBoxLayout() layout.addWidget(self.resultLabel) self.resultGroup.setLayout(layout) def emitPreviewSignal(self): if self.previewStatus.isChecked() == True: self.previewSignal[int,str].emit(1080,' Full Screen') elif self.previewStatus.isChecked() == False: self.previewSignal[str].emit('Preview') def emitPrintSignal(self): pList = [] pList.append(self.numberSpinBox.value ()) pList.append(self.styleCombo.currentText()) self.printSignal.emit(pList) def printPaper(self,list): self.resultLabel.setText('Print: '+'份數(shù):'+ str(list[0]) +' 紙張:'+str(list[1])) def previewPaperWithArgs(self,style,text): self.resultLabel.setText(str(style)+text) def previewPaper(self,text): self.resultLabel.setText(text) def keyPressEvent(self, event): if event.key() == Qt.Key_F1: self.helpSignal.emit('help message') def showHelpMessage(self,message): self.resultLabel.setText(message) #self.statusBar().showMessage(message)if __name__ == ’__main__’: app = QApplication(sys.argv) dispatch = SignalEmit() sys.exit(app.exec_())

運行該函數(shù)之后的效果如下:

python GUI庫圖形界面開發(fā)之PyQt5信號與槽機制、自定義信號基礎介紹

示例說明:

通過一個模擬打印的界面來詳細說明一下關于信號的自定義,在打印的時候可以設定打印的分數(shù),紙張類型,觸發(fā)“打印”按鈕之后,將執(zhí)行結果顯示到右側(cè);通過全屏預覽QCheckBox來選擇是否通過全屏模式進行預覽,將執(zhí)行結果顯示到右側(cè)。

通過點擊F1快捷鍵,可以顯示helpMessage信息。

代碼分析:

L12~15:

helpSignal = pyqtSignal(str)printSignal = pyqtSignal(list)#聲明一個多重載版本的信號,包括了一個帶int和str類型參數(shù)的信號,以及帶str參數(shù)的信號previewSignal = pyqtSignal([int,str],[str])

通過pyqtSignal()定義了三個信號,helpSignal ,printSignal ,previewSignal 。其中:

helpSignal 為str參數(shù)類型的信號; printSignal 為list參數(shù)類型的信號; previewSignal為一個多重載版本的信號,包括了一個帶int和str類型參數(shù)的信號,以及str類行的參數(shù)。

L31~36:

self.helpSignal.connect(self.showHelpMessage)

self.printSignal.connect(self.printPaper)

self.previewSignal[str].connect(self.previewPaper) 

self.previewSignal[int,str].connect(self.previewPaperWithArgs)

self.printButton.clicked.connect(self.emitPrintSignal)

self.previewButton.clicked.connect(self.emitPreviewSignal)

綁定信號和槽;著重說明一下多重載版本的信號的綁定,previewSignal有兩個版本previewSignal(str),previewSignal(int,str)。由于存在兩個版本,從因此在綁定的時候需要顯式的指定信號和槽的綁定關系。

具體如下:

self.previewSignal[str].connect(self.previewPaper)

self.previewSignal[int,str].connect(self.previewPaperWithArgs)

其中[str]參數(shù)的previewSignal信號綁定previewPaper();[int,str]的previewSignal信號綁定previewPaperWithArgs()

L72~76:

def emitPreviewSignal(self): if self.previewStatus.isChecked() == True: self.previewSignal[int,str].emit(1080,' Full Screen') elif self.previewStatus.isChecked() == False: self.previewSignal[str].emit('Preview')

多重載版本的信號的發(fā)射也需要制定對應發(fā)射的版本,類似同信號的版定。

L78~82:

def emitPrintSignal(self): pList = [] pList.append(self.numberSpinBox.value ()) pList.append(self.styleCombo.currentText()) self.printSignal.emit(pList)

如代碼中所示,在信號發(fā)射的時候可以傳遞python數(shù)據(jù)類型的參數(shù),在本例中傳遞list類型的參數(shù)pList.

L93~96:

def keyPressEvent(self, event): if event.key() == Qt.Key_F1: self.helpSignal.emit('help message')

通過復寫keyPressEvent()方法,將F1快捷鍵進行功能的拓展。在windows的大部分應用,我們都會使用一些快捷鍵來快速的完成某些特定的功能。比如F1鍵,會快速調(diào)出幫助界面。那我們就可以復寫keyPressEvent()方法來模擬發(fā)送所需的信號,來完成我們的對應任務.

注意事項:

自定義的信號在init()函數(shù)之前定義; 自定義型號可以傳遞,str、int、list、object、float、tuple、dict等很多類型的參數(shù); 注意signal和slot的調(diào)用邏輯,避免signal和slot之間出現(xiàn)死循環(huán)。如在slot方法中繼續(xù)發(fā)射該信號;

更多關于python GUI庫圖形界面開發(fā)之PyQt5文章請查看下面的相關鏈接

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产东北露脸精品视频| 风流少妇一区二区| 在线一区视频| 在线观看一区视频| 91蝌蚪porny| 天堂va蜜桃一区二区三区漫画版| 日本一区二区在线不卡| 国产精品色呦呦| 欧美国产日韩亚洲一区| 亚洲精品写真福利| 一区二区三区日韩在线观看| 亚洲人成在线播放网站岛国 | 国产91富婆露脸刺激对白| 韩国精品久久久| 福利一区二区在线| 国产一区二区三区久久悠悠色av| 蜜乳av一区二区| 亚洲高清视频中文字幕| 裸体在线国模精品偷拍| 欧美一区二区三区四区在线观看地址 | 国产精品亚洲人在线观看| 国产麻豆精品久久一二三| 91麻豆国产在线观看| 99精品视频在线播放观看| 在线亚洲欧美专区二区| 欧美日韩一区二区国产| 日韩视频在线一区二区三区| 91久久国产综合久久| 欧美综合久久久| 亚洲欧美另类综合偷拍| 精品一区二区影视| 国产精品一区免费观看| 欧美色视频在线观看| 欧美国产激情一区二区三区蜜月| 午夜精品福利在线| 极品少妇一区二区三区| 91麻豆精品国产无毒不卡在线观看 | 99re8在线精品视频免费播放| 欧美一区二区三区视频免费| 色狠狠色狠狠综合| 精品人在线二区三区| 亚洲日本一区二区| 久久精品国产第一区二区三区| 91蜜桃网址入口| 91麻豆精品国产91久久久久久久久| 亚洲日本va在线观看| 国产成人无遮挡在线视频| 亚洲免费网址| 亚洲bdsm女犯bdsm网站| 亚洲精品视频啊美女在线直播| 欧美日韩一级二级三级| 一区二区三区在线免费| 欧美私人免费视频| 日本怡春院一区二区| 欧美日韩中文| 亚洲欧洲精品一区二区精品久久久 | 久久精品成人一区二区三区蜜臀| 国产日韩欧美不卡| 国产精品视频福利| 蜜臀av性久久久久蜜臀aⅴ| 日韩三级视频中文字幕| 亚洲黄色大片| 丰满少妇在线播放bd日韩电影| 欧美国产日韩亚洲一区| 91成人网在线| 国产精品久久久久久久久久妞妞| 国模少妇一区二区三区| 成人免费一区二区三区视频| 国产亚洲毛片在线| 亚洲国产日韩一级| 日韩一区二区免费高清| 欧美日韩国产欧| 视频一区二区三区中文字幕| 欧美无乱码久久久免费午夜一区 | 亚洲五月婷婷| 国产精品一区二区久激情瑜伽| 亚洲美女淫视频| 欧美日产国产精品| 在线视频成人| 国产精品v欧美精品∨日韩| 成人黄色在线看| 91视频在线观看免费| 欧美日本国产| 国产精品一卡| 欧美乱妇15p| 久久亚洲精品小早川怜子| 久久精品人人做人人爽97| 国产精品视频看| 午夜精品一区在线观看| 亚洲成人精品一区| 亚洲国产精品精华液网站| 婷婷激情综合网| 国产成人av网站| 欧美日韩无遮挡| 久久久久久久久久久一区 | 欧美成人官网二区| 国产精品久久久久aaaa| 亚瑟在线精品视频| 国产69精品一区二区亚洲孕妇| 成人久久久精品乱码一区二区三区| 99视频热这里只有精品免费| eeuss鲁片一区二区三区在线观看| 不卡欧美aaaaa| 亚洲综合首页| 国产精品三级久久久久三级| 日韩视频免费观看高清完整版在线观看| 亚洲精品国产日韩| 成人高清免费观看| 国产福利一区在线| 国产一区在线观看麻豆| 久久99最新地址| 麻豆成人久久精品二区三区红| 亚洲国产日韩在线一区模特| 亚洲伦理在线免费看| 国产精品人成在线观看免费| 欧美性大战久久久久久久| 久久久久高清| 3atv在线一区二区三区| 91精品国产综合久久久久久久| 欧美日韩成人高清| 欧美蜜桃一区二区三区| 777午夜精品免费视频| 日韩欧美123| 国产精品免费免费| 久久久久国产精品麻豆| 欧美国产视频在线| 亚洲bdsm女犯bdsm网站| 国产最新精品免费| 色综合色综合色综合色综合色综合 | 欧美日韩国产小视频在线观看| 日韩欧美在线不卡| 亚洲成人精品在线观看| 狠狠色丁香久久婷婷综合丁香| 99re66热这里只有精品3直播| 欧美日韩中文另类| 国产人久久人人人人爽| 国产喷白浆一区二区三区| 精品国产一区a| 一区二区三区国产豹纹内裤在线 | 日韩一二三区视频| 亚洲欧洲av在线| 丝袜美腿成人在线| 欧美在线一区二区| 欧美连裤袜在线视频| 精品一区二区三区久久| 国产精品久久国产精麻豆99网站| 91福利区一区二区三区| 亚洲午夜91| 成人黄色片在线观看| 91麻豆精品国产91久久久更新时间 | 国产欧美一区二区精品秋霞影院| 亚洲精品菠萝久久久久久久| 亚洲成av人片一区二区三区| 国产在线精品视频| 福利电影一区二区| 亚洲无线视频| 久久亚洲一级片| 国产不卡视频一区二区三区| 欧美亚洲免费| 亚洲gay无套男同| 亚洲永久在线| 亚洲人成电影网站色mp4| 91理论电影在线观看| 欧美国产精品v| 中文亚洲字幕| 五月天精品一区二区三区| 91福利国产成人精品照片| 免费在线看成人av| 久久久久久国产精品一区| 免费看日韩a级影片| 制服丝袜亚洲网站| 欧美性大战久久久久| 国产精品美女久久久久av爽李琼| 亚洲小说区图片区| 亚洲国产精品欧美一二99| 欧美精品久久一区二区三区| 91影视在线播放| 一区二区三区资源| 91超碰这里只有精品国产| 白白色 亚洲乱淫| 丝袜亚洲另类欧美| 中文字幕永久在线不卡| 一区二区三区国产盗摄| 91色|porny| 91原创在线视频| 97精品久久久久中文字幕| 麻豆精品一区二区综合av| 在线综合+亚洲+欧美中文字幕| 亚洲精品123区| 成人h精品动漫一区二区三区| 亚洲第一狼人社区| 中文字幕日韩一区二区| 欧美日韩国产高清一区二区三区| 欧美久色视频| 一本一道久久a久久精品综合蜜臀| 成人影视亚洲图片在线| 麻豆精品视频在线| 日本不卡的三区四区五区| 亚洲激情一二三区| **性色生活片久久毛片|