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

Qt 事件處理機制 (上篇)

移動開發
在Qt中,事件被封裝成一個個對象,所有的事件均繼承自抽象類QEvent. 接下來依次談談Qt中有誰來產生、分發、接受和處理事件。

本篇來介紹Qt 事件處理機制 。深入了解事件處理系統對于每個學習Qt人來說非常重要,可以說,Qt是以事件驅動的UI工具集。 大家熟知Signals/Slots在多線程的實現也依賴于Qt事件處理機制。

Qt中,事件被封裝成一個個對象,所有的事件均繼承自抽象類QEvent.  接下來依次談談Qt中有誰來產生、分發、接受和處理事件

1、誰來產生事件: 最容易想到的是我們的輸入設備,比如鍵盤、鼠標產生的

keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEvent事件(他們被封裝成QMouseEvent和QKeyEvent),這些事件來自于底層的操作系統,它們以異步的形式通知Qt事件處理系統,后文會仔細道來。當然Qt自己也會產生很多事件,比如QObject::startTimer()會觸發QTimerEvent. 用戶的程序可還以自己定制事件。

2、誰來接受和處理事件:答案是QObject。在Qt的內省機制剖析一文已經介紹QObject 類是整個Qt對象模型的心臟,事件處理機制是QObject三大職責(內存管理、內省(intropection)與事件處理制)之一。任何一個想要接受并處理事件的對象均須繼承自QObject,可以選擇重載QObject::event()函數或事件的處理權轉給父類。

3、誰來負責分發事件:對于non-GUI的Qt程序,是由QCoreApplication負責將QEvent分發給QObject的子類-Receiver. 對于Qt GUI程序,由QApplication來負責。

接下來,將通過對代碼的解析來看看QT是利用event loop從事件隊列中獲取用戶輸入事件,又是如何將事件轉義成QEvents,并分發給相應的QObject處理。

  1. #include <QApplication>     
  2. #include "widget.h"     
  3. //Section 1     
  4. int main(int argc, char *argv[])     
  5. {     
  6.     QApplication app(argc, argv);     
  7.     Widget window;  // Widget 繼承自QWidget     
  8.     window.show();     
  9.     return app.exec(); // 進入Qpplication事件循環,見section 2     
  10. }     
  11. // Section 2:      
  12. int QApplication::exec()     
  13. {     
  14.    //skip codes     
  15.    //簡單的交給QCoreApplication來處理事件循環=〉section 3     
  16.    return QCoreApplication::exec();     
  17. }     
  18. // Section 3     
  19. int QCoreApplication::exec()     
  20. {     
  21.     //得到當前Thread數據     
  22.     QThreadData *threadData = self->d_func()->threadData;     
  23.     if (threadData != QThreadData::current()) {     
  24.         qWarning("%s::exec: Must be called from the main thread", self->metaObject()->className());     
  25.         return -1;     
  26.     }     
  27.     //檢查event loop是否已經創建     
  28.     if (!threadData->eventLoops.isEmpty()) {     
  29.         qWarning("QCoreApplication::exec: The event loop is already running");     
  30.         return -1;     
  31.     }     
  32.     ...     
  33.     QEventLoop eventLoop;     
  34.     self->d_func()->in_exec = true;     
  35.     self->d_func()->aboutToQuitEmitted = false;     
  36.     //委任QEventLoop 處理事件隊列循環 ==> Section 4     
  37.     int returnCode = eventLoop.exec();     
  38.     ....     
  39.     }     
  40.     return returnCode;     
  41. }     
  42. // Section 4     
  43. int QEventLoop::exec(ProcessEventsFlags flags)     
  44. {     
  45.    //這里的實現代碼不少,最為重要的是以下幾行     
  46.    Q_D(QEventLoop); // 訪問QEventloop私有類實例d     
  47.         try {     
  48.         //只要沒有遇見exit,循環派發事件     
  49.         while (!d->exit)     
  50.             processEvents(flags | WaitForMoreEvents | EventLoopExec);     
  51.     } catch (...) {}     
  52. }     
  53. // Section 5     
  54. bool QEventLoop::processEvents(ProcessEventsFlags flags)     
  55. {     
  56.     Q_D(QEventLoop);     
  57.     if (!d->threadData->eventDispatcher)     
  58.         return false;     
  59.     if (flags & DeferredDeletion)     
  60.         QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);     
  61.     //將事件派發給與平臺相關的QAbstractEventDispatcher子類 =>Section 6     
  62.     return d->threadData->eventDispatcher->processEvents(flags);     
  63. }    
  64. #include <QApplication> 
  65. #include "widget.h"  
  66. //Section 1  
  67. int main(int argc, char *argv[])  
  68. {  
  69.     QApplication app(argc, argv);  
  70.     Widget window;  // Widget 繼承自QWidget  
  71.     window.show();  
  72.     return app.exec(); // 進入Qpplication事件循環,見section 2  
  73. }  
  74. // Section 2:   
  75. int QApplication::exec()  
  76. {  
  77.    //skip codes  
  78.    //簡單的交給QCoreApplication來處理事件循環=〉section 3  
  79.    return QCoreApplication::exec();  
  80. }  
  81. // Section 3  
  82. int QCoreApplication::exec()  
  83. {  
  84.     //得到當前Thread數據  
  85.     QThreadData *threadData = self->d_func()->threadData;  
  86.     if (threadData != QThreadData::current()) {  
  87.         qWarning("%s::exec: Must be called from the main thread", self->metaObject()->className());  
  88.         return -1;  
  89.     }  
  90.     //檢查event loop是否已經創建  
  91.     if (!threadData->eventLoops.isEmpty()) {  
  92.         qWarning("QCoreApplication::exec: The event loop is already running");  
  93.         return -1;  
  94.     }  
  95.     ...  
  96.     QEventLoop eventLoop;  
  97.     self->d_func()->in_exec = true;  
  98.     self->d_func()->aboutToQuitEmitted = false;  
  99.     //委任QEventLoop 處理事件隊列循環 ==> Section 4  
  100.     int returnCode = eventLoop.exec();  
  101.     ....  
  102.     }  
  103.     return returnCode;  
  104. }  
  105. // Section 4  
  106. int QEventLoop::exec(ProcessEventsFlags flags)  
  107. {  
  108.    //這里的實現代碼不少,最為重要的是以下幾行  
  109.    Q_D(QEventLoop); // 訪問QEventloop私有類實例d  
  110.         try {  
  111.         //只要沒有遇見exit,循環派發事件  
  112.         while (!d->exit)  
  113.             processEvents(flags | WaitForMoreEvents | EventLoopExec);  
  114.     } catch (...) {}  
  115. }  
  116. // Section 5  
  117. bool QEventLoop::processEvents(ProcessEventsFlags flags)  
  118. {  
  119.     Q_D(QEventLoop);  
  120.     if (!d->threadData->eventDispatcher)  
  121.         return false;  
  122.     if (flags & DeferredDeletion)  
  123.         QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);  
  124.     //將事件派發給與平臺相關的QAbstractEventDispatcher子類 =>Section 6  
  125.     return d->threadData->eventDispatcher->processEvents(flags);  
  126. }  
  127.    
  128. // Section 6,QTDIR\src\corelib\kernel\qeventdispatcher_win.cpp     
  129. // 這段代碼是完成與windows平臺相關的windows c++。 以跨平臺著稱的Qt同時也提供了對Symiban,Unix等平臺的消息派發支持     
  130. // 其事現分別封裝在QEventDispatcherSymbian和QEventDispatcherUNIX     
  131. // QEventDispatcherWin32派生自QAbstractEventDispatcher.     
  132. bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)     
  133. {     
  134.     Q_D(QEventDispatcherWin32);     
  135.     if (!d->internalHwnd)     
  136.         createInternalHwnd();     
  137.     d->interrupt = false;     
  138.     emit awake();     
  139.     bool canWait;     
  140.     bool retVal = false;     
  141.     bool seenWM_QT_SENDPOSTEDEVENTS = false;     
  142.     bool needWM_QT_SENDPOSTEDEVENTS = false;     
  143.     do {     
  144.         DWORD waitRet = 0;     
  145.         HANDLE pHandles[MAXIMUM_WAIT_OBJECTS - 1];     
  146.         QVarLengthArray<MSG> processedTimers;     
  147.         while (!d->interrupt) {     
  148.             DWORD nCount = d->winEventNotifierList.count();     
  149.             Q_ASSERT(nCount < MAXIMUM_WAIT_OBJECTS - 1);     
  150.             MSG msg;     
  151.             bool haveMessage;     
  152.             if (!(flags & QEventLoop::ExcludeUserInputEvents) && !d->queuedUserInputEvents.isEmpty()) {     
  153.                 // process queued user input events     
  154.                 haveMessage = true;     
  155.                 //從處理用戶輸入隊列中取出一條事件     
  156.                 msg = d->queuedUserInputEvents.takeFirst();     
  157.             } else if(!(flags & QEventLoop::ExcludeSocketNotifiers) && !d->queuedSocketEvents.isEmpty()) {     
  158.                 // 從處理socket隊列中取出一條事件     
  159.                 haveMessage = true;     
  160.                 msg = d->queuedSocketEvents.takeFirst();     
  161.             } else {     
  162.                 haveMessage = PeekMessage(&msg, 0, 0, 0, PM_REMOVE);     
  163.                 if (haveMessage && (flags & QEventLoop::ExcludeUserInputEvents)     
  164.                     && ((msg.message >= WM_KEYFIRST     
  165.                          && msg.message <= WM_KEYLAST)     
  166.                         || (msg.message >= WM_MOUSEFIRST     
  167.                             && msg.message <= WM_MOUSELAST)     
  168.                         || msg.message == WM_MOUSEWHEEL     
  169.                         || msg.message == WM_MOUSEHWHEEL     
  170.                         || msg.message == WM_TOUCH     
  171. #ifndef QT_NO_GESTURES     
  172.                         || msg.message == WM_GESTURE     
  173.                         || msg.message == WM_GESTURENOTIFY     
  174. #endif     
  175.                         || msg.message == WM_CLOSE)) {     
  176.                     // 用戶輸入事件入隊列,待以后處理     
  177.                     haveMessage = false;     
  178.                     d->queuedUserInputEvents.append(msg);     
  179.                 }     
  180.                 if (haveMessage && (flags & QEventLoop::ExcludeSocketNotifiers)     
  181.                     && (msg.message == WM_QT_SOCKETNOTIFIER && msg.hwnd == d->internalHwnd)) {     
  182.                     // socket 事件入隊列,待以后處理     
  183.                     haveMessage = false;     
  184.                     d->queuedSocketEvents.append(msg);     
  185.                 }     
  186.             }     
  187.             ....     
  188.                 if (!filterEvent(&msg)) {     
  189.                     TranslateMessage(&msg);     
  190.                     //將事件打包成message調用Windows API派發出去     
  191.                        //分發一個消息給窗口程序。消息被分發到回調函數,將消息傳遞給windows系統,windows處理完畢,會調用回調函數 => section 7                         
  192.                   DispatchMessage(&msg);     
  193.                 }     
  194.             }                  
  195.         }     
  196.     } while (canWait);     
  197.       ...     
  198.     return retVal;     
  199. }    
  200. // Section 6,QTDIR\src\corelib\kernel\qeventdispatcher_win.cpp  
  201. // 這段代碼是完成與windows平臺相關的windows c++。 以跨平臺著稱的Qt同時也提供了對Symiban,Unix等平臺的消息派發支持  
  202. // 其事現分別封裝在QEventDispatcherSymbian和QEventDispatcherUNIX  
  203. // QEventDispatcherWin32派生自QAbstractEventDispatcher.  
  204. bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)  
  205. {  
  206.     Q_D(QEventDispatcherWin32);  
  207.     if (!d->internalHwnd)  
  208.         createInternalHwnd();  
  209.     d->interrupt = false;  
  210.     emit awake();  
  211.     bool canWait;  
  212.     bool retVal = false;  
  213.     bool seenWM_QT_SENDPOSTEDEVENTS = false;  
  214.     bool needWM_QT_SENDPOSTEDEVENTS = false;  
  215.     do {  
  216.         DWORD waitRet = 0;  
  217.         HANDLE pHandles[MAXIMUM_WAIT_OBJECTS - 1];  
  218.         QVarLengthArray<MSG> processedTimers;  
  219.         while (!d->interrupt) {  
  220.             DWORD nCount = d->winEventNotifierList.count();  
  221.             Q_ASSERT(nCount < MAXIMUM_WAIT_OBJECTS - 1);  
  222.             MSG msg;  
  223.             bool haveMessage;  
  224.             if (!(flags & QEventLoop::ExcludeUserInputEvents) && !d->queuedUserInputEvents.isEmpty()) {  
  225.                 // process queued user input events  
  226.                 haveMessage = true;  
  227.                 //從處理用戶輸入隊列中取出一條事件  
  228.                 msg = d->queuedUserInputEvents.takeFirst();  
  229.             } else if(!(flags & QEventLoop::ExcludeSocketNotifiers) && !d->queuedSocketEvents.isEmpty()) {  
  230.                 // 從處理socket隊列中取出一條事件  
  231.                 haveMessage = true;  
  232.                 msg = d->queuedSocketEvents.takeFirst();  
  233.             } else {  
  234.                 haveMessage = PeekMessage(&msg, 0, 0, 0, PM_REMOVE);  
  235.                 if (haveMessage && (flags & QEventLoop::ExcludeUserInputEvents)  
  236.                     && ((msg.message >= WM_KEYFIRST  
  237.                          && msg.message <= WM_KEYLAST)  
  238.                         || (msg.message >= WM_MOUSEFIRST  
  239.                             && msg.message <= WM_MOUSELAST)  
  240.                         || msg.message == WM_MOUSEWHEEL  
  241.                         || msg.message == WM_MOUSEHWHEEL  
  242.                         || msg.message == WM_TOUCH  
  243. #ifndef QT_NO_GESTURES  
  244.                         || msg.message == WM_GESTURE  
  245.                         || msg.message == WM_GESTURENOTIFY  
  246. #endif  
  247.                         || msg.message == WM_CLOSE)) {  
  248.                     // 用戶輸入事件入隊列,待以后處理  
  249.                     haveMessage = false;  
  250.                     d->queuedUserInputEvents.append(msg);  
  251.                 }  
  252.                 if (haveMessage && (flags & QEventLoop::ExcludeSocketNotifiers)  
  253.                     && (msg.message == WM_QT_SOCKETNOTIFIER && msg.hwnd == d->internalHwnd)) {  
  254.                     // socket 事件入隊列,待以后處理  
  255.                     haveMessage = false;  
  256.                     d->queuedSocketEvents.append(msg);  
  257.                 }  
  258.             }  
  259.             ....  
  260.                 if (!filterEvent(&msg)) {  
  261.                     TranslateMessage(&msg);  
  262.                     //將事件打包成message調用Windows API派發出去  
  263.                        //分發一個消息給窗口程序。消息被分發到回調函數,將消息傳遞給windows系統,windows處理完畢,會調用回調函數 => section 7                      
  264.                   DispatchMessage(&msg);  
  265.                 }  
  266.             }               
  267.         }  
  268.     } while (canWait);  
  269.       ...  
  270.     return retVal;  
  271. }   
  272.  
  273. // Section 7 windows窗口回調函數 定義在QTDIR\src\gui\kernel\qapplication_win.cpp     
  274. extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)     
  275. {     
  276.    ...     
  277.    //將消息重新封裝成QEvent的子類QMouseEvent ==> Section 8     
  278.     result = widget->translateMouseEvent(msg);         
  279.    ...     
  280. }     
  281.      
  282. // Section 7 windows窗口回調函數 定義在QTDIR\src\gui\kernel\qapplication_win.cpp  
  283. extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  284. {  
  285.    ...  
  286.    //將消息重新封裝成QEvent的子類QMouseEvent ==> Section 8  
  287.     result = widget->translateMouseEvent(msg);      
  288.    ...  

從Section 1~Section7, Qt進入QApplication的event loop,經過層層委任,最終QEventloop的processEvent將通過與平臺相關的QAbstractEventDispatcher的子類QEventDispatcherWin32獲得用戶的用戶輸入事件,并將其打包成message后,通過標準Windows API ,把消息傳遞給了Windows OS,Windows OS得到通知后回調QtWndProc,  至此事件的分發與處理完成了一半的路程。

小結:Qt 事件處理機制 (上篇)的內容介紹完了,在下文中,我們將進一步討論當我們收到來在Windows的回調后,事件又是怎么一步步打包成QEvent并通過QApplication分發給最終事件的接受和處理者QObject::event.請繼續看Qt 事件處理機制 (下篇)。***希望本文能幫你解決問題!

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

2011-07-01 14:20:59

Qt 事件

2009-09-02 18:34:28

C#鼠標事件

2011-07-05 18:32:52

QT 信號 機制

2011-03-17 09:20:05

異常處理機制

2011-06-17 13:18:17

Qt 文件

2011-07-21 15:20:41

java異常處理機制

2011-06-23 14:05:32

Qt 事件機制

2025-06-25 06:18:46

Linux多線程機制

2021-07-03 17:53:52

Java異常處理機制

2024-03-04 10:00:35

數據庫處理機制

2009-07-09 18:15:42

JDBC事務處理

2009-08-05 18:09:17

C#異常處理機制

2010-03-05 15:40:16

Python異常

2011-04-06 10:27:46

Java異常處理

2009-06-02 10:32:30

Oracle并發處理

2011-06-23 14:40:13

Qt 信號

2023-02-08 08:11:58

Spring容器核心事件

2009-08-06 09:45:53

AOS多核處理機制上網行為管理青蓮

2009-07-31 11:28:42

錯誤處理機制ASP.NET

2011-09-05 17:40:40

MTK定時器
點贊
收藏

51CTO技術棧公眾號

青青草精品毛片| 日韩欧美美女一区二区三区| 欧美亚洲另类在线一区二区三区| 99超碰在线观看| 成人在线免费视频观看| 日韩一区二区在线看| 久操网在线观看| 国产在线观看高清视频| 激情成人综合网| 午夜精品福利视频| 极品尤物一区二区| japanese色系久久精品| 在线亚洲精品福利网址导航| 美国av在线播放| 亚洲欧美一区二区三| 久久草av在线| 欧美最猛性xxxxx免费| 亚洲激情图片网| 日本亚洲不卡| 欧美一级久久久久久久大片| 激情视频综合网| av在线资源| 亚洲视频一区二区在线| 牛人盗摄一区二区三区视频| 亚洲xxxx天美| 美女网站色91| 6080yy精品一区二区三区| 久久国产高清视频| 精品日韩在线| 日韩电影中文字幕一区| 奇米777在线| 国产精品99| 色综合视频一区二区三区高清| 日本中文字幕一级片| 在线视频91p| 91美女片黄在线观看91美女| 成人自拍偷拍| 国产99久一区二区三区a片| 人人精品人人爱| 亲子乱一区二区三区电影| 久久久久久久久精| 中文无码久久精品| 久久手机免费视频| 天堂av免费在线| 精品日韩一区| 国产亚洲在线播放| 久久国产柳州莫菁门| 亚洲制服欧美另类| 日韩h在线观看| 师生出轨h灌满了1v1| 嫩呦国产一区二区三区av| 欧美久久免费观看| 久久6免费视频| 色综合视频一区二区三区44| 欧美日韩国产综合一区二区三区| 人妻无码视频一区二区三区| 欧美自拍电影| 日本高清不卡视频| 91网址在线播放| 亚洲综合av一区二区三区| 在线精品视频小说1| 奇米影音第四色| 福利一区二区| 777奇米成人网| 无码人妻一区二区三区在线视频| 久久国际精品| 日韩精品一区二区三区在线观看 | 香蕉久久夜色精品国产| 97视频在线观看网址| 99久久精品国产亚洲| 日日夜夜精品视频免费| 国产精品久久久久久久久久新婚 | 调教驯服丰满美艳麻麻在线视频| 精品视频免费| 久久国内精品一国内精品| 精品无码久久久久成人漫画| 欧美福利影院| 97精品伊人久久久大香线蕉 | 欧美在线观看18| 99国产精品久久久久久| 久久久久久久久成人| 精品日韩欧美一区二区| 国产精品无码网站| 成人一区而且| 精品国产依人香蕉在线精品| 国内偷拍精品视频| 国产毛片一区| 国产中文欧美精品| 丰满大乳国产精品| 久久久久9999亚洲精品| 中国一级黄色录像| 国产v日韩v欧美v| 欧美最猛性xxxxx直播| 久久久久xxxx| 欧美色资源站| 色偷偷av一区二区三区乱| 91高清免费看| 免费日韩av片| 91久久嫩草影院一区二区| 婷婷在线观看视频| 中文字幕一区二区三区不卡在线| 国产免费一区二区视频| 精品久久久网| 亚洲国产三级网| 久久久久人妻一区精品色| 亚洲小说欧美另类婷婷| 国产精品av在线| 精品人妻aV中文字幕乱码色欲| 久久美女艺术照精彩视频福利播放 | 久章草在线视频| 99视频这里有精品| 亚洲男子天堂网| 私库av在线播放| 热久久国产精品| 精品国产免费人成电影在线观...| 色大18成网站www在线观看| 性做久久久久久免费观看| 少妇一级淫免费放| 亚洲精品国产动漫| 欧美大片在线影院| 又污又黄的网站| 久久蜜臀中文字幕| 五十路熟女丰满大屁股| 久久天堂久久| www.日韩系列| 无码人妻精品一区二区三区不卡| 成人免费三级在线| 一区二区三区四区国产| 老司机2019福利精品视频导航| 精品国产亚洲一区二区三区在线观看| 蜜桃av.com| 麻豆视频观看网址久久| 欧美日韩一区二区三| 超碰在线cao| 精品国精品国产| 中文字幕在线有码| 精品亚洲国内自在自线福利| 亚洲国产欧美一区二区三区不卡| 免费日韩电影| 亚洲精品中文字幕有码专区| 亚洲 欧美 视频| 成人国产亚洲欧美成人综合网| 男女激烈动态图| 999色成人| 久热精品视频在线免费观看| 一级黄色片在线| 国产精品欧美精品| 国产野外作爱视频播放| 欧美色婷婷久久99精品红桃| 国产成人精品免高潮费视频| 国产一级二级三级在线观看| 色欧美88888久久久久久影院| 三级电影在线看| 亚洲影音先锋| 欧洲av一区| 精品免费av在线| 一区二区欧美激情| 夜夜躁狠狠躁日日躁av| 最新成人av在线| 午夜视频在线观| 永久91嫩草亚洲精品人人| 91在线视频免费| 欧美性猛片xxxxx免费中国 | 国产精品久久久久久久久借妻| 成人午夜在线观看视频| 欧美亚洲动漫精品| 可以免费看av的网址| 国产综合色精品一区二区三区| 亚洲区成人777777精品| 粉嫩av一区二区| 4388成人网| 91av资源在线| 欧美一区二区日韩| 精品无码一区二区三区电影桃花| av中文字幕亚洲| 欧美 日韩 国产 激情| 久久要要av| www.久久久| 伊人久久综合一区二区| 在线国产精品视频| 国产色综合视频| 婷婷六月综合亚洲| av片在线免费看| 成人免费视频一区| 免费午夜视频在线观看| 99热国内精品| 精品无人区一区二区三区| yw.尤物在线精品视频| 久久久极品av| 青青草视频在线观看| 欧美日本免费一区二区三区| 欧美一级高潮片| 久久九九国产精品| 亚洲精品久久久久久| 媚黑女一区二区| 97av中文字幕| 国产精品一区高清| 99porn视频在线| 在线国产成人影院| 欧美激情亚洲国产| 国产精品视频二区三区| 日韩视频免费直播| 国产男人搡女人免费视频| 亚洲最大成人综合| 波多野结衣一二三四区| av电影在线观看完整版一区二区| 中文字幕国内自拍| 亚洲美女网站| 视频一区二区视频| 精品国产aⅴ| 国产99在线免费| 欧美日韩伦理一区二区| 国产91成人video| 亚洲第一图区| 中文字幕av一区| 欧美伦理影视网| 精品国产自在久精品国产| 中文字幕一区二区三区免费看| 亚洲国产一区二区在线播放| 99成人在线观看| 欧美激情一区二区三区全黄 | 国产精品网在线观看| 国产在线久久久| 精品三区视频| 国产mv免费观看入口亚洲| 91桃色在线观看| 欧美尺度大的性做爰视频| 午夜老司机在线观看| 亚洲欧美福利视频| 天堂中文在线8| 精品国产一区久久| 成人激情四射网| 91精品国产91久久综合桃花| 中文字幕在线观看精品| 色婷婷综合久久久中文一区二区| 可以在线观看av的网站| 亚洲成人免费观看| 久久久久97国产| 一区二区三区欧美在线观看| 日韩一区二区不卡视频| 国产精品国产三级国产普通话蜜臀 | 国产精品传媒麻豆hd| 国产福利精品在线| 日韩精品专区| 青青久久av北条麻妃黑人| www.youjizz.com在线| 久久久久久久久久国产| www在线看| 久久男人的天堂| av午夜在线观看| 国内揄拍国内精品| а√天堂资源官网在线资源| 91禁外国网站| 范冰冰一级做a爰片久久毛片| 68精品国产免费久久久久久婷婷| 97蜜桃久久| 55夜色66夜色国产精品视频| 亚洲最大网站| 国产精品成av人在线视午夜片| 日韩在线观看不卡| 国产色综合天天综合网| 国产精品欧美一区二区三区不卡| 91系列在线观看| 亚洲一区二区三区四区电影 | 久久不见久久见国语| 日韩av一级大片| 色婷婷一区二区三区| 中文字幕中文字幕在线中心一区 | 日韩最新av在线| 国产精品实拍| 久久久久久久亚洲精品| 亚洲欧洲高清| 国产美女精彩久久| 欧美成年网站| 国产欧美日韩视频一区二区三区| 四虎884aa成人精品最新| 日韩高清av| 影视一区二区| 人妻少妇被粗大爽9797pw| 日韩激情在线观看| 日韩欧美理论片| 成人av片在线观看| 精品国产成人亚洲午夜福利| 日本一区免费视频| 久久免费黄色网址| 一本久久a久久免费精品不卡| 亚洲专区在线播放| 亚洲国产精品va在线观看黑人| av在线天堂| 久久免费国产视频| 99欧美精品| 国产精品国产精品| 国模吧精品视频| 久久久久福利视频| 爽好久久久欧美精品| 亚洲va综合va国产va中文| 北条麻妃一区二区三区| 久久久久久成人网| 亚洲va国产天堂va久久en| 亚洲精品国产精品乱码视色| 亚洲精品一区二区在线观看| 137大胆人体在线观看| 久久久女女女女999久久| 成人久久网站| 久久综合色一本| 欧美在线国产| 亚洲这里只有精品| eeuss影院一区二区三区| 日本黄色录像视频| 天天免费综合色| 国产免费高清视频| 国产午夜精品视频| av在线资源| 99在线视频免费观看| 日韩欧美大片| 波多野结衣家庭教师视频| 国产成人高清视频| eeuss中文字幕| 欧美日韩在线免费| 亚洲爱爱综合网| 不卡毛片在线看| 国产成人精选| 日本一区视频在线观看| 亚洲高清在线| 91精产国品一二三| 亚洲欧美日韩国产另类专区| 波多野结衣网站| 亚洲精品之草原avav久久| 福利在线免费视频| 国产精品对白刺激久久久| 亚洲色图88| 爱豆国产剧免费观看大全剧苏畅| 国产日韩综合av| 亚洲精品成人在线视频| 精品亚洲一区二区三区在线播放| 国模雨婷捆绑高清在线| 99久久99久久| 欧美fxxxxxx另类| 永久免费黄色片| 日韩毛片在线免费观看| 国产精品系列视频| xxx成人少妇69| 日韩一级特黄| 在线一区高清| 黄页视频在线91| 中文字幕无码日韩专区免费| 欧美日韩国产高清一区二区 | 老熟妇仑乱视频一区二区| 91最新地址在线播放| 日韩大片免费在线观看| 亚洲成年人影院在线| zzzwww在线看片免费| 国内一区二区三区在线视频| 在线日韩电影| 黄色av网址在线观看| 精品久久久久久久久久久久久久| 色婷婷中文字幕| 91av在线影院| 国产精品嫩模av在线| 网站一区二区三区| 最新热久久免费视频| 亚洲女人18毛片水真多| 欧美放荡办公室videos4k| xxxxxhd亚洲人hd| 91专区在线观看| 久久久久国产精品厨房| 一道本在线视频| 欧美成人在线免费| 老司机aⅴ在线精品导航| 国产主播在线看| 国产精品免费aⅴ片在线观看| 97在线公开视频| 欧美激情中文字幕在线| 日本国产精品| 亚洲视频第二页| 亚洲一区二区免费视频| 免费理论片在线观看播放老| 国产日本欧美一区二区三区在线| 亚洲精品一二三区区别| 国产黑丝在线观看| 欧美色涩在线第一页| 啪啪免费视频一区| 欧美午夜精品久久久久久蜜| 黑人巨大精品欧美黑白配亚洲| 国产在线视频第一页| 亚洲天堂av电影| 国色天香久久精品国产一区| 日日碰狠狠添天天爽超碰97| 中文子幕无线码一区tr | 亚洲国产成人爱av在线播放| 日韩电影大全网站| 青青草免费在线视频观看| 99这里只有久久精品视频| 国产一区免费看| 欧美国产日韩中文字幕在线| 九九热线有精品视频99| 韩国三级丰满少妇高潮| 一本大道久久精品懂色aⅴ| 黄色网页在线免费观看| 美乳视频一区二区|