亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python3+PyQt5 圖形項的自定義和交互--實現page Designer應用程序

2019-11-06 06:52:29
字體:
來源:轉載
供稿:網友

本文通過Python3+PyQt5實現《python Qt Gui 快速編程》這本書的page Designer應用程序,采用QGraphicsView,QGraphiCSScene,QGraphicsItem,這個程序包含有多個文本,圖片和框的頁面。有些圖形類在PyQt5已過時,所以本代碼改動幅度比較大。主要的類或方法的改變如下: QMatrix==>QTransform setMatrix==>setTransform rotate ==> setRotation 本例中,由于event.delta()已過時,還重寫了wheelEvent方法:

def wheelEvent(self, event): #factor = 1.41 ** (-event.delta() / 240.0) #factor = 1.41 ** (-abs(event.startX()-event.y()) / 240.0) factor = event.angleDelta().y()/120.0 if event.angleDelta().y()/120.0 > 0: factor=2 else: factor=0.5 self.scale(factor, factor)

為了保持代碼可讀行,增加了一個類:

class GraphicsPixmapItem(QGraphicsPixmapItem): #add by yangrongdong def __init__(self,pixmap): super(QGraphicsPixmapItem, self).__init__(pixmap)

本例中還有包含菜單的按鈕:

if text == "&Align": menu = QMenu(self) for text, arg in ( ("Align &Left", Qt.AlignLeft), ("Align &Right", Qt.AlignRight), ("Align &Top", Qt.AlignTop), ("Align &Bottom", Qt.AlignBottom)): wrapper = functools.partial(self.setAlignment, arg) self.wrapped.append(wrapper) menu.addAction(text, wrapper) button.setMenu(menu)

本例中還針對QStyleOptionGraphicsItem.levelOfDetail已過時,改寫如下: option.levelOfDetailFromTransform(self.transform()) 下面為完整的代碼:

#!/usr/bin/env python3import functoolsimport randomimport sysfrom PyQt5.QtCore import (QByteArray, QDataStream, QFile, QFileInfo, QIODevice, QPoint, QPointF, QRectF, Qt)from PyQt5.QtWidgets import (Qapplication, QDialog, QDialogButtonBox, QFileDialog, QFontComboBox, QGraphicsItem, QGraphicsPixmapItem, QGraphicsScene, QGraphicsTextItem, QGraphicsView, QGridLayout, QHBoxLayout, QLabel, QMenu, QMessageBox,QPushButton, QSpinBox, QStyle, QTextEdit, QVBoxLayout)from PyQt5.QtGui import QFont,QCursor,QFontMetrics,QTransform,QPainter,QPen,QPixmapfrom PyQt5.QtPRintSupport import QPrinter,QPrintDialogMAC = Truetry: from PyQt5.QtGui import qt_mac_set_native_menubarexcept ImportError: MAC = False#PageSize = (595, 842) # A4 in pointsPageSize = (612, 792) # US Letter in pointsPointSize = 10MagicNumber = 0x70616765FileVersion = 1Dirty = Falseclass TextItemDlg(QDialog): def __init__(self, item=None, position=None, scene=None, parent=None): super(QDialog, self).__init__(parent) self.item = item self.position = position self.scene = scene self.editor = QTextEdit() self.editor.setAcceptRichText(False) self.editor.setTabChangesFocus(True) editorLabel = QLabel("&Text:") editorLabel.setBuddy(self.editor) self.fontComboBox = QFontComboBox() self.fontComboBox.setCurrentFont(QFont("Times", PointSize)) fontLabel = QLabel("&Font:") fontLabel.setBuddy(self.fontComboBox) self.fontSpinBox = QSpinBox() self.fontSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.fontSpinBox.setRange(6, 280) self.fontSpinBox.setValue(PointSize) fontSizeLabel = QLabel("&Size:") fontSizeLabel.setBuddy(self.fontSpinBox) self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok| QDialogButtonBox.Cancel) self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) if self.item is not None: self.editor.setPlainText(self.item.toPlainText()) self.fontComboBox.setCurrentFont(self.item.font()) self.fontSpinBox.setValue(self.item.font().pointSize()) layout = QGridLayout() layout.addWidget(editorLabel, 0, 0) layout.addWidget(self.editor, 1, 0, 1, 6) layout.addWidget(fontLabel, 2, 0) layout.addWidget(self.fontComboBox, 2, 1, 1, 2) layout.addWidget(fontSizeLabel, 2, 3) layout.addWidget(self.fontSpinBox, 2, 4, 1, 2) layout.addWidget(self.buttonBox, 3, 0, 1, 6) self.setLayout(layout) self.fontComboBox.currentFontChanged.connect(self.updateUi) self.fontSpinBox.valueChanged.connect(self.updateUi) self.editor.textChanged.connect(self.updateUi) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.setWindowTitle("Page Designer - {0} Text Item".format( "Add" if self.item is None else "Edit")) self.updateUi() def updateUi(self): font = self.fontComboBox.currentFont() font.setPointSize(self.fontSpinBox.value()) self.editor.document().setDefaultFont(font) self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( bool(self.editor.toPlainText())) def accept(self): if self.item is None: self.item = TextItem("", self.position, self.scene) font = self.fontComboBox.currentFont() font.setPointSize(self.fontSpinBox.value()) self.item.setFont(font) self.item.setPlainText(self.editor.toPlainText()) self.item.update() global Dirty Dirty = True QDialog.accept(self)class TextItem(QGraphicsTextItem): def __init__(self, text, position, scene, font=QFont("Times", PointSize), matrix=QTransform()): super(TextItem, self).__init__(text) self.setFlags(QGraphicsItem.ItemIsSelectable| QGraphicsItem.ItemIsMovable) self.setFont(font) self.setPos(position) self.setTransform(matrix) scene.clearSelection() scene.addItem(self) self.setSelected(True) global Dirty Dirty = True def parentWidget(self): return self.scene().views()[0] def itemChange(self, change, variant): if change != QGraphicsItem.ItemSelectedChange: global Dirty Dirty = True return QGraphicsTextItem.itemChange(self, change, variant) def mouseDoubleClickEvent(self, event): dialog = TextItemDlg(self, self.parentWidget()) dialog.exec_()class GraphicsPixmapItem(QGraphicsPixmapItem): #add by yangrongdong def __init__(self,pixmap): super(QGraphicsPixmapItem, self).__init__(pixmap)class BoxItem(QGraphicsItem): def __init__(self, position, scene, style=Qt.SolidLine, rect=None, matrix=QTransform()): super(BoxItem, self).__init__() self.setFlags(QGraphicsItem.ItemIsSelectable| QGraphicsItem.ItemIsMovable| QGraphicsItem.ItemIsFocusable) if rect is None: rect = QRectF(-10 * PointSize, -PointSize, 20 * PointSize, 2 * PointSize) self.rect = rect self.style = style self.setPos(position) self.setTransform(matrix) scene.clearSelection() scene.addItem(self) self.setSelected(True) self.setFocus() global Dirty Dirty = True def parentWidget(self): return self.scene().views()[0] def boundingRect(self): return self.rect.adjusted(-2, -2, 2, 2) def paint(self, painter, option, widget): pen = QPen(self.style) pen.setColor(Qt.black) pen.setWidth(1) if option.state & QStyle.State_Selected: pen.setColor(Qt.blue) painter.setPen(pen) painter.drawRect(self.rect) def itemChange(self, change, variant): if change != QGraphicsItem.ItemSelectedChange: global Dirty Dirty = True return QGraphicsItem.itemChange(self, change, variant) def contextMenuEvent(self, event): wrapped = [] menu = QMenu(self.parentWidget()) for text, param in ( ("&Solid", Qt.SolidLine), ("&Dashed", Qt.DashLine), ("D&otted", Qt.DotLine), ("D&ashDotted", Qt.DashDotLine), ("DashDo&tDotted", Qt.DashDotDotLine)): wrapper = functools.partial(self.setStyle, param) wrapped.append(wrapper) menu.addAction(text, wrapper) menu.exec_(event.screenPos()) def setStyle(self, style): self.style = style self.update() global Dirty Dirty = True def keyPressEvent(self, event): factor = PointSize / 4 changed = False if event.modifiers() & Qt.ShiftModifier: if event.key() == Qt.Key_Left: self.rect.setRight(self.rect.right() - factor) changed = True elif event.key() == Qt.Key_Right: self.rect.setRight(self.rect.right() + factor) changed = True elif event.key() == Qt.Key_Up: self.rect.setBottom(self.rect.bottom() - factor) changed = True elif event.key() == Qt.Key_Down: self.rect.setBottom(self.rect.bottom() + factor) changed = True if changed: self.update() global Dirty Dirty = True else: QGraphicsItem.keyPressEvent(self, event)class GraphicsView(QGraphicsView): def __init__(self, parent=None): super(GraphicsView, self).__init__(parent) self.setDragMode(QGraphicsView.RubberBandDrag) self.setRenderHint(QPainter.Antialiasing) self.setRenderHint(QPainter.TextAntialiasing) def wheelEvent(self, event): #factor = 1.41 ** (-event.delta() / 240.0) factor = event.angleDelta().y()/120.0 if event.angleDelta().y()/120.0 > 0: factor=2 else: factor=0.5 self.scale(factor, factor)class MainForm(QDialog): def __init__(self, parent=None): super(MainForm, self).__init__(parent) self.filename = "" self.copiedItem = QByteArray() self.pasteOffset = 5 self.prevPoint = QPoint() self.addOffset = 5 self.borders = [] self.printer = QPrinter(QPrinter.HighResolution) self.printer.setPageSize(QPrinter.Letter) self.view = GraphicsView() self.scene = QGraphicsScene(self) self.scene.setSceneRect(0, 0, PageSize[0], PageSize[1]) self.addBorders() self.view.setScene(self.scene) self.wrapped = [] # Needed to keep wrappers alive buttonLayout = QVBoxLayout() for text, slot in ( ("Add &Text", self.addText), ("Add &Box", self.addBox), ("Add Pi&xmap", self.addPixmap), ("&Align", None), ("&Copy", self.copy), ("C&ut", self.cut), ("&Paste", self.paste), ("&Delete...", self.delete), ("&Rotate", self.rotate), ("Pri&nt...", self.print_), ("&Open...", self.open), ("&Save", self.save), ("&Quit", self.accept)): button = QPushButton(text) if not MAC: button.setFocusPolicy(Qt.NoFocus) if slot is not None: button.clicked.connect(slot) if text == "&Align": menu = QMenu(self) for text, arg in ( ("Align &Left", Qt.AlignLeft), ("Align &Right", Qt.AlignRight), ("Align &Top", Qt.AlignTop), ("Align &Bottom", Qt.AlignBottom)): wrapper = functools.partial(self.setAlignment, arg) self.wrapped.append(wrapper) menu.addAction(text, wrapper) button.setMenu(menu) if text == "Pri&nt...": buttonLayout.addStretch(5) if text == "&Quit": buttonLayout.addStretch(1) buttonLayout.addWidget(button) buttonLayout.addStretch() layout = QHBoxLayout() layout.addWidget(self.view, 1) layout.addLayout(buttonLayout) self.setLayout(layout) fm = QFontMetrics(self.font()) self.resize(self.scene.width() + fm.width(" Delete... ") + 50, self.scene.height() + 50) self.setWindowTitle("Page Designer") def addBorders(self): self.borders = [] rect = QRectF(0, 0, PageSize[0], PageSize[1]) self.borders.append(self.scene.addRect(rect, Qt.yellow)) margin = 5.25 * PointSize self.borders.append(self.scene.addRect( rect.adjusted(margin, margin, -margin, -margin), Qt.yellow)) def removeBorders(self): while self.borders: item = self.borders.pop() self.scene.removeItem(item) del item def reject(self): self.accept() def accept(self): self.offerSave() QDialog.accept(self) def offerSave(self): if (Dirty and QMessageBox.question(self, "Page Designer - Unsaved Changes", "Save unsaved changes?", QMessageBox.Yes|QMessageBox.No) == QMessageBox.Yes): self.save() def position(self): point = self.mapFromGlobal(QCursor.pos()) if not self.view.geometry().contains(point): coord = random.randint(36, 144) point = QPoint(coord, coord) else: if point == self.prevPoint: point += QPoint(self.addOffset, self.addOffset) self.addOffset += 5 else: self.addOffset = 5 self.prevPoint = point return self.view.mapToScene(point) def addText(self): dialog = TextItemDlg(position=self.position(), scene=self.scene, parent=self) dialog.exec_() def addBox(self): BoxItem(self.position(), self.scene) def addPixmap(self): path = (QFileInfo(self.filename).path() if self.filename else ".") fname,filetype = QFileDialog.getOpenFileName(self, "Page Designer - Add Pixmap", path, "Pixmap Files (*.bmp *.jpg *.png *.xpm)") if not fname: return self.createPixmapItem(QPixmap(fname), self.position()) def createPixmapItem(self, pixmap, position, matrix=QTransform()): item = GraphicsPixmapItem(pixmap) item.setFlags(QGraphicsItem.ItemIsSelectable| QGraphicsItem.ItemIsMovable) item.setPos(position) item.setTransform(matrix) self.scene.clearSelection() self.scene.addItem(item) item.setSelected(True) global Dirty Dirty = True return item def selectedItem(self): items = self.scene.selectedItems() if len(items) == 1: return items[0] return None def copy(self): item = self.selectedItem() if item is None: return self.copiedItem.clear() self.pasteOffset = 5 stream = QDataStream(self.copiedItem, QIODevice.WriteOnly) self.writeItemToStream(stream, item) def cut(self): item = self.selectedItem() if item is None: return self.copy() self.scene.removeItem(item) del item def paste(self): if self.copiedItem.isEmpty(): return stream = QDataStream(self.copiedItem, QIODevice.ReadOnly) self.readItemFromStream(stream, self.pasteOffset) self.pasteOffset += 5 def setAlignment(self, alignment): # Items are returned in arbitrary order items = self.scene.selectedItems() if len(items) <= 1: return # Gather coordinate data leftXs, rightXs, topYs, bottomYs = [], [], [], [] for item in items: rect = item.sceneBoundingRect() leftXs.append(rect.x()) rightXs.append(rect.x() + rect.width()) topYs.append(rect.y()) bottomYs.append(rect.y() + rect.height()) # Perform alignment if alignment == Qt.AlignLeft: xAlignment = min(leftXs) for i, item in enumerate(items): item.moveBy(xAlignment - leftXs[i], 0) elif alignment == Qt.AlignRight: xAlignment = max(rightXs) for i, item in enumerate(items): item.moveBy(xAlignment - rightXs[i], 0) elif alignment == Qt.AlignTop: yAlignment = min(topYs) for i, item in enumerate(items): item.moveBy(0, yAlignment - topYs[i]) elif alignment == Qt.AlignBottom: yAlignment = max(bottomYs) for i, item in enumerate(items): item.moveBy(0, yAlignment - bottomYs[i]) global Dirty Dirty = True def rotate(self): for item in self.scene.selectedItems(): item.setRotation(item.rotation()+30) def delete(self): items = self.scene.selectedItems() if (len(items) and QMessageBox.question(self, "Page Designer - Delete", "Delete {0} item{1}?".format(len(items), "s" if len(items) != 1 else ""), QMessageBox.Yes|QMessageBox.No) == QMessageBox.Yes): while items: item = items.pop() self.scene.removeItem(item) del item global Dirty Dirty = True def print_(self): dialog = QPrintDialog(self.printer) if dialog.exec_(): painter = QPainter(self.printer) painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.TextAntialiasing) self.scene.clearSelection() self.removeBorders() self.scene.render(painter) self.addBorders() def open(self): self.offerSave() path = (QFileInfo(self.filename).path() if self.filename else ".") fname,filetype = QFileDialog.getOpenFileName(self, "Page Designer - Open", path, "Page Designer Files (*.pgd)") if not fname: return self.filename = fname fh = None try: fh = QFile(self.filename) if not fh.open(QIODevice.ReadOnly): raise IOError(str(fh.errorString())) items = self.scene.items() while items: item = items.pop() self.scene.removeItem(item) del item self.addBorders() stream = QDataStream(fh) stream.setVersion(QDataStream.Qt_5_7) magic = stream.readInt32() if magic != MagicNumber: raise IOError("not a valid .pgd file") fileVersion = stream.readInt16() if fileVersion != FileVersion: raise IOError("unrecognised .pgd file version") while not fh.atEnd(): self.readItemFromStream(stream) except IOError as e: QMessageBox.warning(self, "Page Designer -- Open Error", "Failed to open {0}: {1}".format(self.filename, e)) finally: if fh is not None: fh.close() global Dirty Dirty = False def save(self): if not self.filename: path = "." fname,filetype = QFileDialog.getSaveFileName(self, "Page Designer - Save As", path, "Page Designer Files (*.pgd)") if not fname: return self.filename = fname fh = None try: fh = QFile(self.filename) if not fh.open(QIODevice.WriteOnly): raise IOError(str(fh.errorString())) self.scene.clearSelection() stream = QDataStream(fh) stream.setVersion(QDataStream.Qt_5_7) stream.writeInt32(MagicNumber) stream.writeInt16(FileVersion) for item in self.scene.items(): self.writeItemToStream(stream, item) except IOError as e: QMessageBox.warning(self, "Page Designer -- Save Error", "Failed to save {0}: {1}".format(self.filename, e)) finally: if fh is not None: fh.close() global Dirty Dirty = False def readItemFromStream(self, stream, offset=0): type = "" position = QPointF() matrix = QTransform() rotateangle=0#add by yangrongdong type=stream.readQString() stream >> position >> matrix if offset: position += QPointF(offset, offset) if type == "Text": text = "" font = QFont() text=stream.readQString() stream >> font rotateangle=stream.readFloat() tx=TextItem(text, position, self.scene, font, matrix) tx.setRotation(rotateangle) elif type == "Box": rect = QRectF() stream >> rect style = Qt.PenStyle(stream.readInt16()) rotateangle=stream.readFloat() bx=BoxItem(position, self.scene, style, rect, matrix) bx.setRotation(rotateangle) elif type == "Pixmap": pixmap = QPixmap() stream >> pixmap rotateangle=stream.readFloat() px=self.createPixmapItem(pixmap, position, matrix) px.setRotation(rotateangle) def writeItemToStream(self, stream, item): if isinstance(item, TextItem): stream.writeQString("Text") stream<<item.pos()<< item.transform() stream.writeQString(item.toPlainText()) stream<< item.font() stream.writeFloat(item.rotation())#add by yangrongdong elif isinstance(item, GraphicsPixmapItem): stream.writeQString("Pixmap") stream << item.pos() << item.transform() << item.pixmap() stream.writeFloat(item.rotation())#add by yangrongdong elif isinstance(item, BoxItem): stream.writeQString("Box") stream<< item.pos() << item.transform() << item.rect stream.writeInt16(item.style) stream.writeFloat(item.rotation())#add by yangrongdongapp = QApplication(sys.argv)form = MainForm()rect = QApplication.desktop().availableGeometry()form.resize(int(rect.width() * 0.6), int(rect.height() * 0.9))form.show()app.exec_()

運行結果 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区视频观看免费| 精品国产91乱高清在线观看| 亚洲激情第一页| 亚洲午夜av电影| 欧美大片免费观看| 久久成年人免费电影| 中文字幕免费国产精品| 7777精品久久久久久| 国产91精品网站| 亚洲精品视频在线观看视频| 国产有码在线一区二区视频| 中文字幕日本欧美| 在线免费看av不卡| 成人免费看黄网站| 亚洲性生活视频在线观看| 久久亚洲精品网站| 最近日韩中文字幕中文| 国产精品视频大全| 欧美乱大交做爰xxxⅹ性3| 亚洲成人激情在线观看| 伊人久久久久久久久久| 日韩中文字幕视频| 国产欧美精品日韩精品| 亚洲黄一区二区| 精品亚洲一区二区三区在线播放| 亚洲欧美日韩区| 欧美性少妇18aaaa视频| 精品在线欧美视频| 亚洲免费视频在线观看| 欧美日韩一区二区免费在线观看| 欧美日韩国产中字| 亚洲女人天堂成人av在线| 日本精品视频在线播放| 黑丝美女久久久| 69av成年福利视频| 91av在线影院| 国内精品久久久久| 精品国产一区二区在线| 欧美在线视频网站| 97精品在线观看| 国产精品一区二区三区久久| 自拍视频国产精品| 日韩精品极品视频| 久久久精品一区二区三区| 欧美极品少妇xxxxⅹ喷水| 在线播放精品一区二区三区| 久久久久久国产精品美女| 日韩一级裸体免费视频| 韩国一区二区电影| 中文字幕日韩av| 欧美精品18videosex性欧美| 欧美视频中文字幕在线| 国产一区玩具在线观看| 热久久这里只有精品| 国产不卡精品视男人的天堂| 久久久日本电影| 在线a欧美视频| 国产日本欧美一区二区三区| 色综合久久88色综合天天看泰| 国产亚洲欧美另类中文| 成人激情视频在线播放| 国内精品伊人久久| 精品偷拍各种wc美女嘘嘘| 国产丝袜一区二区| 欧美综合在线观看| 久久的精品视频| 国产精品精品视频一区二区三区| 激情久久av一区av二区av三区| 亚洲性日韩精品一区二区| 久久精品中文字幕免费mv| 欧美大成色www永久网站婷| 国内精品模特av私拍在线观看| 在线性视频日韩欧美| 欧美做爰性生交视频| 久久天天躁狠狠躁夜夜躁| 欧美日韩亚洲一区二| 成人福利在线视频| 亚洲精品v天堂中文字幕| 尤物精品国产第一福利三区| 久久精品精品电影网| 亚洲精品v天堂中文字幕| 亚洲精品国产拍免费91在线| 在线观看免费高清视频97| 欧美精品电影免费在线观看| 成人激情电影一区二区| 日韩精品视频在线| 国产精品xxx视频| 亚洲一区二区三区乱码aⅴ| 激情懂色av一区av二区av| 久久青草精品视频免费观看| 久久视频在线播放| 国产精品电影在线观看| 一区二区亚洲精品国产| 中文字幕亚洲色图| 国产精品免费一区二区三区都可以| 日本久久久a级免费| 亚洲精品成人久久久| 成人有码在线播放| 国产精品www| 9.1国产丝袜在线观看| 一区二区欧美在线| 这里只有精品在线观看| 国产一区二区色| 91中文在线观看| 日韩成人av在线播放| 亚洲成人黄色网| 亚洲女同精品视频| 国产精品视频午夜| 欧美大码xxxx| 亚洲成人免费在线视频| 永久免费毛片在线播放不卡| 欧美激情欧美激情在线五月| 精品久久久久人成| 91亚洲国产成人久久精品网站| 亚洲人免费视频| 国产精品电影久久久久电影网| 中文日韩在线视频| 日韩精品日韩在线观看| 国产精品久久久久7777婷婷| 国产一区av在线| 亚洲第一综合天堂另类专| 成人激情视频在线播放| 亚洲精品久久久久中文字幕二区| 人人爽久久涩噜噜噜网站| 欧美日韩中国免费专区在线看| 国产精品久久久久久久久男| 奇门遁甲1982国语版免费观看高清| www.欧美免费| 欧洲s码亚洲m码精品一区| 91国在线精品国内播放| 97久久超碰福利国产精品…| 欧美日韩在线观看视频小说| 亚洲另类欧美自拍| 欧美大秀在线观看| 97人洗澡人人免费公开视频碰碰碰| 日韩成人av在线播放| 日韩一区二区福利| 国产精品一区二区三区免费视频| 久久久久日韩精品久久久男男| 亚洲三级av在线| 日本高清视频一区| 国产精自产拍久久久久久| 亚洲欧美日韩天堂| 日韩视频免费中文字幕| 深夜福利一区二区| 国内精品美女av在线播放| 992tv成人免费视频| 日本一区二区三区在线播放| 久久综合伊人77777尤物| 国产精品白丝jk喷水视频一区| 国产成人精彩在线视频九色| 中文字幕日韩在线播放| 中文字幕亚洲激情| 亚洲福利在线看| 亚洲黄色www网站| 精品久久久久久中文字幕一区奶水| 亚洲精品久久久久久下一站| 亚洲性生活视频| 日韩大陆欧美高清视频区| 欧美精品成人91久久久久久久| 青青久久av北条麻妃海外网| 亚洲一区亚洲二区| 亚洲性69xxxbbb| 日韩欧美中文字幕在线观看|