精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 Qt 源碼分析 QObject

移動開發
本文介紹的是Qt 源碼分析 QObject,代碼一一實現,先來看內容。

Qt 源碼分析 QObject是本文要介紹的內容,很詳細的去解析,先來看內容。QtQObject

1.試驗代碼:

  1. #include <QApplication> 
  2. #include <QtCore> 
  3. #include <QtGui> 
  4. int main(int argc, char *argv[])  
  5. {  
  6.  QApplication app(argc, argv);  
  7.  int size = sizeof(QObject);  
  8.  QPushButton* quit = new QPushButton("Quit");  
  9.  delete quit;  
  10.  return app.exec();  

QObject是Qt類體系的唯一基類,就象MFC中的CObject和Dephi中的TObject,是Qt各種功能的源頭活水,因此Qt源碼分析的***節就放在這個QObject上

  1. int size = sizeof(QObject); 

QObject的大小是8,除了虛函數表指針需要的4個字節以外,另外的4個字節是:

  1. QObjectData *d_ptr; 

QObject中的數據被封裝在QObjectData類中了,為什么要封裝數據呢?

原因是Qt中有一個很重要的設計模式就是句柄實體模式,也就是以QObject為基類的類一般都是句柄類,一般只有一個指針指向一個實體類,在實體類中保存全部的數據

而且一般情況下這個指針還是私有的,方便以后修改句柄類的實現細節

因此,也可以說和句柄類繼承關系平行的也有一套實體類派生體系,因此,準確的說,Qt的基類其實有兩個,一個是QObject,這是句柄類的唯一基類,另一個是QObjectData,這是實體

類的基類

  1. QObjectData類定義如下:  
  2. class QObjectData {  
  3. public:  
  4.     virtual ~QObjectData() = 0;  
  5.     QObject *q_ptr;  
  6.     QObject *parent;  
  7.     QObjectList children;  
  8.  
  9.     uint isWidget : 1;  
  10.     uint pendTimer : 1;  
  11.     uint blockSig : 1;  
  12.     uint wasDeleted : 1;  
  13.     uint ownObjectName : 1;  
  14.     uint sendChildEvents : 1;  
  15.     uint receiveChildEvents : 1;  
  16.     uint unused : 25;  
  17.     int postedEvents;  
  18. #ifdef QT3_SUPPORT  
  19.     int postedChildInsertedEvents;  
  20. #else  
  21.     int reserved;  
  22. #endif  
  23. };  
  24. QObject *q_ptr; 

這個指針指向實體類對應的句柄類,這和上面的代碼

  1. QObjectData *d_ptr; 

遙相呼應,使得句柄類和實體類可以雙向的引用,為什么是這樣的命名方式呢?可能q指的是Qt接口類,d指的是Data數據類,這當然是猜測了,但是或許可以方便你記憶,在Qt中,

這兩個指針名字是非常重要的,必須記住

但是僅僅如此還是不容易使用這兩個指針,因為它們都是基類的類型,難道每次使用都要類型轉換嗎?為了簡單起見,Qt在這里聲明了兩個宏

  1. #define Q_DECLARE_PRIVATE(Class) \  
  2.     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(d_ptr); } \  
  3.     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(d_ptr); } \  
  4.     friend class Class##Private;  
  5.  
  6. #define Q_DECLARE_PUBLIC(Class) \  
  7.     inline Class* q_func() { return static_cast<Class *>(q_ptr); } \  
  8.     inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \  
  9.     friend class Class; 

只要在類的頭文件中使用這兩個宏,就可以通過函數直接得到實體類和句柄類的實際類型了,而且這里還聲明了友元,使得數據類和句柄類連訪問權限也不用顧忌了

而且為了cpp文件中調用的方便,更是直接聲明了以下兩個宏

  1. #define Q_D(Class) Class##Private * const d = d_func()  
  2. #define Q_Q(Class) Class * const q = q_func() 

好了,使用起來倒是方便了,但是以后局部變量可千萬不能聲明為d和q了

這里的d_func和q_func函數是非常常用的函數,可以理解為一個是得到數據類,一個是得到Qt接口類

  1. QObject *parent; 

這里指向QObject的父類

  1. QObjectList children; 

這里指向QObject相關的子類列表

這確實是個大膽的設計,如果系統中產生了1000000個QObject實例(對于大的系統,這個數字很容易達到吧),每個QObject子類平均下來是100(這個數字可能大了),

光這些指針的開銷就有1000000*100*4=400M,是夠恐怖的,如果我們必須在靈活性和運行開銷之間做一個選擇的話,無疑Qt選擇了前者,對此我也很難評論其中的優劣,

還是祈求越來越強的硬件水平和Qt這么多年來得到的赫赫威名保佑我們根本就沒有這個問題吧,呵呵

總之,Qt確實在內存中保存了所有類實例的樹型結構

  1. uint isWidget : 1;  
  2. uint pendTimer : 1;  
  3. uint blockSig : 1;  
  4. uint wasDeleted : 1;  
  5. uint ownObjectName : 1;  
  6. uint sendChildEvents : 1;  
  7. uint receiveChildEvents : 1;  
  8. uint unused : 25; 

這些代碼就簡單了,主要是一些標記位,為了節省內存開銷,這里采用了位域的語法,還保留了25位為unused,留做以后的擴充

  1. #ifdef QT3_SUPPORT  
  2.     int postedChildInsertedEvents;  
  3. #else  
  4.     int reserved;  
  5. #endif 

這里或許是為了兼容Qt3下序列化的數據吧,即使沒有定義QT3_SUPPORT,還是保留了一個數據reserved,以保證整個QObjectData的大小不變

#p#

具體看一個例子吧,對這種句柄實體模式加深認識,這就是Qt中的按鈕類QPushButton

  1. QPushButton的句柄類派生關系是:  
  2. QObject  
  3.  QWidget  
  4.   QAbstractButton  
  5.    QPushButton  
  6.      
  7. QPushButton的實體類派生關系是:  
  8. QObjectData  
  9.  QObjectPrivate  
  10.   QWidgetPrivate  
  11.    QAbstractButtonPrivate  
  12.     QPushButtonPrivate 

可以看出,這里確實是一個平行體系,只不過實體類派生關系中多了一個QObjectPrivate,這個類封裝了線程處理,信號和槽機制等具體的實現,可以說它才是Qt實體類中

真正起作用的基類,而QObjectData不過是一層淺淺的數據封裝而已

先不忙了解QObjectPrivate類中的接口和實現,我們先看看在Qt中,句柄類和實體類這兩條體系是如何構造的?

  1. QPushButton* quit = new QPushButton("Quit"); 

創建一個Qt的按鈕,簡簡單單一行代碼,其實背后大有玄機

  1. QPushButton::QPushButton(const QString &text, QWidget *parent)  
  2.     : QAbstractButton(*new QPushButtonPrivate, parent) 

首先QPushButton的構造函數中調用了QAbstractButton的構造函數,同時馬上new出來一個QPushButtonPrivate實體類,然后把指針轉換為引用傳遞給QAbstractButton

  1. QAbstractButton::QAbstractButton(QAbstractButtonPrivate &dd, QWidget *parent)  
  2.     : QWidget(dd, parent, 0) 

QAbstractButton的構造函數中繼續調用基類QWidget的構造函數,同時把QPushButtonPrivate實體類指針繼續傳給基類

  1. QWidget::QWidget(QWidgetPrivate &dd, QWidget* parent, Qt::WFlags f)  
  2.     : QObject(dd, ((parent && (parent->windowType() == Qt::Desktop)) ? 0 : parent)), QPaintDevice() 

QWidget繼續坐著同樣的事情

  1. QObject::QObject(QObjectPrivate &dd, QObject *parent)  
  2.     : d_ptr(&dd) 

終于到了基類QObject,這里就直接把QPushButtonPrivate的指針賦值給了d_ptr(還記得這個變量名稱吧)

最終在QPushButton構造時同時產生的new QPushButtonPrivate被寫到了QObject中的d_ptr中

  1. QObject::QObject(QObjectPrivate &dd, QObject *parent)  
  2.     : d_ptr(&dd)  
  3. {  
  4.     Q_D(QObject);  
  5.     ::qt_addObject(d_ptr->q_ptr = this);  
  6.     QThread *currentThread = QThread::currentThread();  
  7.     d->thread = currentThread ? QThreadData::get(currentThread)->id : -1;  
  8.     Q_ASSERT_X(!parent || parent->d_func()->thread == d->thread, "QObject::QObject()",  
  9.                "Cannot create children for a parent that is in a different thread.");  
  10.     if (parent && parent->d_func()->thread != d->thread)  
  11.         parent = 0;  
  12.     if (d->isWidget) {  
  13.         if (parent) {  
  14.             d->parentparent = parent;  
  15.             d->parent->d_func()->children.append(this);  
  16.         }  
  17.         // no events sent here, this is done at the end of the QWidget constructor  
  18.     } else {  
  19.         setParent(parent);  
  20.     }  

然后執行QObject的構造函數,這里主要是一些線程的處理,先不理它

  1. QWidget::QWidget(QWidgetPrivate &dd, QWidget* parent, Qt::WFlags f)  
  2.     : QObject(dd, ((parent && (parent->windowType() == Qt::Desktop)) ? 0 : parent)), QPaintDevice()  
  3. {  
  4.     d_func()->init((parent && parent->windowType() == Qt::Desktop ? parent : 0), f);  

然后是QWidget的構造函數,這里調用了數據類QWidgetPrivate的init函數,這個函數不是虛函數,因此靜態解析成QWidgetPrivate的init函數調用

  1. QAbstractButton::QAbstractButton(QAbstractButtonPrivate &dd, QWidget *parent)  
  2.     : QWidget(dd, parent, 0)  
  3. {  
  4.     Q_D(QAbstractButton);  
  5.     d->init();  

然后是QAbstractButton的構造函數,這里調用了數據類QAbstractButton的init函數,這個函數不是虛函數,因此靜態解析成QAbstractButton的init函數調用

  1. QPushButton::QPushButton(const QString &text, QWidget *parent)  
  2.     : QAbstractButton(*new QPushButtonPrivate, parent)  
  3. {  
  4.     Q_D(QPushButton);  
  5.     d->init();  
  6.     setText(text);  

然后是QPushButton的構造函數,這里調用了數據類QPushButton的init函數,這個函數不是虛函數,因此靜態解析成QPushButton的init函數調用。

#p#

現在的事情很清楚了,總結一下:

QPushButton在構造的時候同時生成了QPushButtonPrivate指針,QPushButtonPrivate創建時依次調用數據類基類的構造函數

QPushButton的構造函數中顯示的調用了基類的構造函數并把QPushButtonPrivate指針傳遞過去,QPushButton創建時依次調用接口類基類的構造函數

在接口類的構造函數中調用了平行數據類的init函數,因為這個函數不是虛函數,因此就就是此次調用了數據類的init函數

需要指出的是,為什么QPushButtonPrivate實體類指針要轉換為引用呢?為什么不是直接傳遞指針?結論是人家喜歡這樣寫,就是不傳指針傳引用,而且要用一個*new之類的怪異語法,真叫人沒有辦法,其實這里用指針是一樣的,代碼看起來也自然一些.

  1. delete quit; 

說完了構造,再說說析構

  1. QPushButton::~QPushButton()  
  2. {  

這里當然會調用QPushButton的析構函數了

  1.  QAbstractButton::~QAbstractButton()  
  2. {  
  3. #ifndef QT_NO_BUTTONGROUP  
  4.     Q_D(QAbstractButton);  
  5.     if (d->group)  
  6.         d->group->removeButton(this);  
  7. #endif  

然后是QAbstractButton的析構函數

  1. QWidget::~QWidget()  
  2. {  
  3.     Q_D(QWidget);  
  4. ...  

然后是QWidget的析構函數,這里洋洋灑灑一大堆代碼,先不管它

  1. QObject::~QObject()  
  2. {  
  3. ...  

***是QObject的析構函數,這里也是洋洋灑灑的一大堆

  1.     Q_D(QObject);  
  2.     if (d->wasDeleted) {  
  3. #if defined(QT_DEBUG)  
  4.         qWarning("Double QObject deletion detected");  
  5. #endif  
  6.         return;  
  7.     }  
  8.     d->wasDeleted = true

這些沒有什么好說的,就是設一個wasDeleted的標志,防止再被引用,對于單線程情況下,馬上就要被刪除了,還搞什么標記啊,根本沒用,但是對于多線程情況下,這個標記應該是有用的

  1. // set all QPointers for this object to zero  
  2. GuardHash *hash = ::guardHash();  
  3. if (hash) {  
  4.     QWriteLocker locker(guardHashLock());  
  5.     GuardHash::iterator it = hash->find(this);  
  6.     const GuardHash::iterator end = hash->end();  
  7.     while (it.key() == this && it != end) {  
  8.         *it.value() = 0;  
  9.         it = hash->erase(it);  
  10.     }  

這里是支持QPointers的實現代碼,我們以后再說

  1. emit destroyed(this); 

Qt的一個指針刪除時要發送destroyed信號,一般情況下是沒有槽來響應的

  1. QConnectionList *list = ::connectionList();  
  2. if (list) {  
  3.     QWriteLocker locker(&list->lock);  
  4.     list->remove(this);  

這里清除了信號槽機制中的記錄

  1. if (d->pendTimer) {  
  2.     // have pending timers  
  3.     QThread *thr = thread();  
  4.     if (thr || d->thread == 0) {  
  5.         // don't unregister timers in the wrong thread  
  6.         QAbstractEventDispatcher *eventDispatcher = QAbstractEventDispatcher::instance(thr);  
  7.         if (eventDispatcher)  
  8.             eventDispatcher->unregisterTimers(this);  
  9.     }  

這里清除定時器

  1. d->eventFilters.clear(); 

這里清除事件過濾機制

  1. // delete children objects  
  2. if (!d->children.isEmpty()) {  
  3.     qDeleteAll(d->children);  
  4.     d->children.clear();  

這里清除所有子類指針,當然每個子類指針清除時又會清除它的所有子類,因此Qt中new出來的指針很少有顯示對應的delete,因為只要最上面的指針被框架刪除了,

它所連帶的所有子類都被自動刪除了

  1. {  
  2.     QWriteLocker locker(QObjectPrivate::readWriteLock());  
  3.     ::qt_removeObject(this);  
  4.  
  5.     /*  
  6.       theoretically, we cannot check d->postedEvents without  
  7.       holding the postEventList.mutex for the object's thread,  
  8.       but since we hold the QObjectPrivate::readWriteLock(),  
  9.       nothing can go into QCoreApplication::postEvent(), which  
  10.       effectively means noone can post new events, which is what  
  11.       we are trying to prevent. this means we can safely check  
  12.       d->postedEvents, since we are fairly sure it will not  
  13.       change (it could, but only by decreasing, i.e. removing  
  14.       posted events from a differebnt thread)  
  15.     */  
  16.     if (d->postedEvents > 0)  
  17.         QCoreApplication::removePostedEvents(this);  
  18. }  
  19. if (d->parent)        // remove it from parent object  
  20.     d->setParent_helper(0);  
  21. delete d;  
  22. d_ptr = 0

這里要刪除相關的數據類指針了

小結:Qt 源碼分析 QObject的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-23 14:05:32

Qt 事件機制

2011-06-23 13:38:27

QT 元對象 信號

2011-06-23 13:25:42

QT 源碼 窗口

2011-08-25 15:41:42

Lua源碼

2009-07-08 13:22:30

JDK源碼分析Set

2011-06-20 11:14:09

Qt QxtGlobalS 熱鍵

2011-06-23 11:16:39

Qt Excel

2011-06-22 14:47:51

QT 多線程 QObject

2011-06-23 14:27:48

QT QLibrary 動態庫

2011-06-24 10:05:51

QT 對象 父對象

2011-06-28 15:01:01

Qt PIMPL

2011-06-20 17:33:58

Qt MeegoTouch Maemo

2011-06-23 15:32:05

Qt Windows消息

2011-06-23 15:10:39

Qt 窗體

2011-06-14 15:45:02

Qt Object

2023-06-15 14:09:00

解析器Servlet容器

2022-03-07 10:05:02

SpringStreamMQ連接

2011-06-17 09:58:26

Qt Chapter QObject

2011-06-24 12:58:49

Qt LineEdit

2011-06-17 10:19:11

Qt QWidge QSetting
點贊
收藏

51CTO技術棧公眾號

久久久久久久久久久视频| 欧美主播福利视频| 中文字幕永久免费| 亚洲天堂电影| 日韩毛片精品高清免费| 国产一区不卡在线观看| 特级西西444www高清大视频| 欧美搞黄网站| 一区二区成人av| 又大又长粗又爽又黄少妇视频| 在线手机中文字幕| 亚洲免费av在线| 日韩福利一区二区三区| 成人1区2区3区| 免费视频最近日韩| 国外成人性视频| 中文字幕求饶的少妇| 久久精品色综合| 欧美日韩精品免费观看视频| 三上悠亚久久精品| 国产调教视频在线观看| 久久久午夜精品| 成人欧美一区二区三区视频 | 4438x全国最大成人| 香蕉成人av| 午夜一区二区三区视频| 欧美少妇在线观看| a√在线中文网新版址在线| 波多野结衣在线一区| 91免费高清视频| 波多野结衣不卡| 亚洲欧美日韩综合国产aⅴ| 欧美巨大黑人极品精男| 成人免费毛片xxx| 精品欧美久久| 亚洲欧洲日产国产网站| 国产精品手机在线观看| 色播一区二区| 日韩欧美一级二级| 亚洲女人在线观看| 欧美视频精品| 欧美日韩日本视频| 中文字幕网av| 成人黄色免费观看| 日本道精品一区二区三区 | av资源新版天堂在线| 亚洲精品视频观看| 国产免费xxx| h片在线免费| 亚洲另类春色国产| 中国老女人av| 欧美色图天堂| 亚洲国产日产av| 69sex久久精品国产麻豆| 欧美24videosex性欧美| 亚洲成a人片在线观看中文| 日韩亚洲欧美一区二区| 激情av在线| 亚洲午夜精品17c| 女人帮男人橹视频播放| 91av久久| 精品久久久一区| 久久久免费视频网站| 在线观看福利电影| 日韩欧美在线一区| 成年人在线观看视频免费| 成人在线中文| 日韩午夜av一区| 日韩精品人妻中文字幕有码| 日韩mv欧美mv国产网站| 亚洲欧美国产日韩天堂区| 亚洲成人网在线播放| 日韩精品91| 欧美另类xxx| wwwxxx亚洲| 日韩电影免费在线| 成人在线激情视频| 亚洲精品国偷拍自产在线观看蜜桃| 成人一区二区三区在线观看| 久久精品日产第一区二区三区| 你懂得在线网址| 国产精品麻豆久久久| 亚洲一区 在线播放| 国产精品电影| 欧美丝袜自拍制服另类| 日本美女久久久| 日韩精品导航| 久久精品99无色码中文字幕| 日韩手机在线观看| 久久精品国产精品亚洲红杏| 韩国成人一区| 成年人免费在线视频| 有坂深雪av一区二区精品| 亚洲熟妇av一区二区三区漫画| 88xx成人网| 精品久久久久久亚洲综合网| av网在线播放| 亚洲片区在线| 成人黄色av免费在线观看| 国产日韩av网站| av中文资源在线| 亚洲另类色综合网站| 久久久噜噜噜www成人网| 狠狠久久伊人中文字幕| 精品国偷自产国产一区| 永久免费毛片在线观看| 黄色精品一区| 国产主播欧美精品| 四虎精品在线| 一区二区三区在线视频免费观看| 99久久久无码国产精品6| 精品国产18久久久久久二百| 亚洲人成免费电影| 麻豆亚洲av成人无码久久精品| 三级亚洲高清视频| 国产精品美女黄网| 欧美精品日韩少妇| 日韩欧美在线网址| 蜜臀视频在线观看| 欧美一区国产在线| 国产精品久久久久久久久久三级 | 国内精品免费在线观看| 美乳视频一区二区| 羞羞污视频在线观看| 欧美日韩一本到| 亚洲专区区免费| 亚洲一级电影| 不卡视频一区二区| 超碰在线观看免费| 欧美精品v国产精品v日韩精品| 公侵犯人妻一区二区三区| 亚洲清纯自拍| 国产精品香蕉视屏| 香蕉久久aⅴ一区二区三区| 欧美综合欧美视频| 免费黄色片网站| 视频一区二区三区中文字幕| 欧美日产一区二区三区在线观看| 草草视频在线| 精品国产不卡一区二区三区| 欧美日韩激情在线观看| 国产精品一区一区三区| 日韩不卡一二区| 精品中文字幕一区二区三区四区| www.xxxx欧美| 国产露脸国语对白在线| 亚洲色图欧洲色图| 男人午夜视频在线观看| 久久久久电影| 亚洲自拍偷拍色片视频| 中文字幕伦理免费在线视频 | 97se亚洲综合在线| 羞羞视频在线观看不卡| 欧美刺激午夜性久久久久久久| 国产精品久久久久久久精| 极品尤物av久久免费看| 爱爱爱视频网站| 久久国产精品美女| 欧美黑人性视频| 人妻va精品va欧美va| 亚洲国产综合视频在线观看| 一区二区三区少妇| 欧美一级专区| 视频在线精品一区| 欧美成人高清视频在线观看| 欧美精品免费在线观看| 国产黄色高清视频| 午夜精品福利一区二区蜜股av| 国产精品一级黄片| 日韩中文字幕91| 这里只有精品66| 欧美影院精品| 国产91精品久久久久久久| 韩国精品视频| 欧美高清视频一二三区| 国产一级视频在线播放| 26uuu成人网一区二区三区| 国产精品亚洲a| 国产大片一区| 国产精品乱码一区二区三区| 成人免费看黄| 美女av一区二区| 四虎影视精品成人| 欧美高清dvd| 日韩精品一卡二卡| 国产精品日日摸夜夜摸av| 中文写幕一区二区三区免费观成熟| av不卡免费看| 亚洲高清123| 北条麻妃一区二区三区在线观看| 欧洲精品在线视频| av在线免费网站| 国产视频精品自拍| 国产青青草视频| 欧美日韩亚洲91| 国产小视频你懂的| 国产成a人亚洲| 国内自拍视频网| 99精品99| 懂色av粉嫩av蜜臀av| 亚欧日韩另类中文欧美| 91精品免费视频| 美女福利一区二区三区| 欧美人在线观看| 毛片在线免费| 亚洲国产精品va在线看黑人| 91精品国产综合久| 欧美性猛交xxxx| 久久伊人成人网| 中文字幕一区二区三区蜜月| 中文字字幕码一二三区| 国产一区二区三区不卡在线观看| 成人性做爰aaa片免费看不忠| 国产精品99一区二区| 亚洲视频在线二区| 九九久久精品| 久久国产一区二区| 色妞ww精品视频7777| 91精品久久久久久| 香蕉成人影院| 136fldh精品导航福利| 污的网站在线观看| 久久精品国产69国产精品亚洲| 国产在线观看高清视频| 日韩精品极品在线观看播放免费视频| 精品久久国产视频| 555夜色666亚洲国产免| 中文字幕资源网| 91久久精品日日躁夜夜躁欧美| 国产精品9191| 亚洲精品日日夜夜| 永久久久久久久| 亚洲私人黄色宅男| 国产人与禽zoz0性伦| 国产精品女主播av| 亚洲无人区码一码二码三码的含义| av亚洲产国偷v产偷v自拍| 成年女人免费视频| 成人av在线影院| 人妻换人妻a片爽麻豆| 国产盗摄视频一区二区三区| 亚洲成人av免费观看| 国产乱人伦精品一区二区在线观看 | 无码人妻一区二区三区一| 国产做a爰片久久毛片| 亚洲天堂国产视频| 久久成人久久鬼色| 成人黄色一级大片| 韩国三级电影一区二区| 五月花丁香婷婷| 久久精品国内一区二区三区| 在线免费观看视频黄| 欧美中文日韩| 好男人www社区| 青青草一区二区三区| 日本超碰在线观看| 国产一区二区三区日韩 | 狠狠人妻久久久久久综合| 亚洲v精品v日韩v欧美v专区| av资源免费观看| 色999日韩国产欧美一区二区| 尤物视频免费观看| 欧美日韩在线三级| 国产普通话bbwbbwbbw| 精品欧美乱码久久久久久| 日本高清视频www| 国产偷国产偷亚洲清高网站| 成人午夜电影在线观看| 久久综合五月天| 91九色国产在线播放| 日本久久久久久久久| 久久婷婷五月综合色丁香| 亚洲精品免费在线视频| 九色丨蝌蚪丨成人| 日韩精品国内| 欧美1区免费| aⅴ在线免费观看| 精品一区二区三区在线播放视频 | 国产精品电影一区二区三区| 国产成人无码aa精品一区| 精品福利樱桃av导航| 真实的国产乱xxxx在线91| 欧美一区二区三区电影| 四虎精品一区二区三区| 最近的2019中文字幕免费一页| 污网站在线免费看| 国产精品av在线| 日韩精品成人| 日本在线免费观看一区| 中文字幕免费一区二区三区| 中国丰满人妻videoshd | 图片区亚洲欧美小说区| 日本少妇高潮喷水视频| 精品一区二区三区免费| a级一a一级在线观看| 亚洲色图制服丝袜| 一区二区三区在线观看av| 欧美一级专区免费大片| 可以免费看污视频的网站在线| 欧美成人一区二区三区电影| 欧美精品高清| 国产亚洲情侣一区二区无| 99精品在线观看| 欧美两根一起进3p做受视频| 国产精品66部| 免费成人美女女在线观看| 精品成人av一区| www.黄色av| 久久天天躁夜夜躁狠狠躁2022| 欧美极品免费| 国产亚洲精品久久飘花| 久久精品免费一区二区三区| 国产a级片免费观看| av在线播放不卡| 国产一卡二卡在线播放| 欧美猛男男办公室激情| 啊v视频在线| 国产99久久精品一区二区永久免费| 国产精品美女在线观看直播| 亚洲av首页在线| 精久久久久久久久久久| 91无套直看片红桃在线观看| 色爱区综合激月婷婷| 亚洲人视频在线观看| 久久久久久久一区二区三区| 精品国产亚洲一区二区在线观看| 亚洲欧洲一区二区福利| 日本美女一区二区三区视频| 久久精品国产亚洲av久| 欧美色道久久88综合亚洲精品| 日韩一级片免费| 欧美激情手机在线视频| 日韩成人18| 欧美中文字幕在线观看视频| 国产在线精品免费av| 午夜激情福利电影| 欧美日韩国产一级片| 午夜视频在线观看网站| 国产精自产拍久久久久久| 日韩aaaa| 激情文学亚洲色图| 亚洲视频免费在线观看| 国产精品久久久久久久免费| yw.139尤物在线精品视频| 少妇高潮一区二区三区99| 五月天男人天堂| 国产精品影视天天线| 久久国产精品波多野结衣av| 精品国产一区二区三区不卡| 678在线观看视频| 久久久久久久久一区| 久久精品亚洲| 1024手机在线观看你懂的| 欧美日韩精品一区二区| 免费高清在线观看| 91久久国产自产拍夜夜嗨| 国产精品v欧美精品v日本精品动漫| aaa黄色大片| 欧美性黄网官网| 香蕉视频在线播放| 亚洲一区制服诱惑| 亚洲国产片色| 男人舔女人下部高潮全视频| 欧美日韩中文字幕一区| 超碰在线免费公开| 国产一区免费视频| 久久青草久久| 日韩在线观看免| 欧美精品一区视频| 黑人巨大精品| 在线看成人av电影| 成人一级黄色片| 国产精品21p| 另类色图亚洲色图| 精品欧美午夜寂寞影院| 亚洲五月天综合| 亚洲一区二区在线免费观看视频| 亚洲av片在线观看| 国产视频福利一区| 在线 亚洲欧美在线综合一区| 久久久久久国产免费a片| 91精品国产欧美一区二区| 成入视频在线观看| 亚洲一区二区高清视频| 国产成人aaa| 亚洲高清在线看| 欧美精品video| 凹凸成人精品亚洲精品密奴| 日本泡妞xxxx免费视频软件| 欧美日韩在线视频一区| 黄网址在线观看| 欧美日韩高清免费| 国产精品白丝jk黑袜喷水| 久久久久99精品成人片我成大片| 久久精品国产成人| 久久99视频| 无码人妻一区二区三区免费n鬼沢| 在线精品视频免费播放| segui88久久综合| 中文字幕一区二区三区四区五区六区|