99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Qt撤銷重做全解析:QUndoStack命令模式實(shí)戰(zhàn)指南

Qt撤銷重做全解析:QUndoStack命令模式實(shí)戰(zhàn)指南 只要是寫過編輯器類軟件的人幾乎都躲不開同一個(gè)話題撤銷 / 重做。文本輸入框刪錯(cuò)字要能退回來畫圖工具手滑畫歪一筆要能還原模型編輯器里誤刪了一個(gè)節(jié)點(diǎn)總得讓人反悔。QUndoStack 就是 Qt 專門為這類場(chǎng)景提供的一套完整框架它把一個(gè)看似簡(jiǎn)單、做起來全是細(xì)節(jié)的撤銷棧抽象成了命令模式下的標(biāo)準(zhǔn)實(shí)現(xiàn)。這篇文章會(huì)從需求拆解、核心原理、具體落地再到常見坑位把你需要用到的部分一次講清楚。適用的人群很寬剛接觸 Qt 的開發(fā)者可以把它當(dāng)作入門指南寫過一段時(shí)間 C 但始終在自己攢撤銷邏輯的朋友也能在這里找到系統(tǒng)化的替代方案。1. 為什么要用 QUndoStack撤銷 / 重做的需求拆解1.1 撤銷 / 重做看似簡(jiǎn)單真正落地時(shí)問題一堆表面上看撤銷 / 重做就是記住上一步然后還原。很多新手的第一反應(yīng)是存快照每次操作前把整個(gè)文檔復(fù)制一份撤銷時(shí)把舊版本覆蓋回去。這個(gè)思路在數(shù)據(jù)量小的時(shí)候確實(shí)能跑但一旦文檔變大比如一個(gè)帶幾千個(gè)圖元的矢量圖、一份多頁(yè)表格或者一段幾十萬字的文本每次快照的內(nèi)存開銷和拷貝耗時(shí)都會(huì)迅速失控。更麻煩的是快照方案很難回答用戶做了三次修改之后只想撤銷中間那一次這類需求你只能無腦回退整個(gè)版本而不是精準(zhǔn)撤銷某個(gè)命令。另一種常見思路是反向操作比如插入了一段文字撤銷時(shí)再?gòu)耐晃恢脛h掉。這個(gè)方案比快照聰明但依然有死角有些操作天然不可逆比如把圖片壓縮、把文件覆蓋、執(zhí)行一次批量替換你根本沒有足夠的反向信息把它恢復(fù)如初。所以真正健壯的撤銷體系必須讓操作自己攜帶undo和redo兩套邏輯這也正是 QUndoStack 的命令模式設(shè)計(jì)。1.2 自己維護(hù)撤銷棧的三個(gè)典型痛點(diǎn)我見過不少項(xiàng)目在早期都是自己定義結(jié)構(gòu)體、用兩個(gè) QList 或者 std::vector 硬寫撤銷邏輯寫到最后幾乎都會(huì)遇到同樣的三類問題。第一類是狀態(tài)與數(shù)據(jù)綁死。最常見的寫法是每次修改數(shù)據(jù)前先手動(dòng)把舊值塞進(jìn)一個(gè)列表然后等撤銷時(shí)再取出來賦值回去。這種代碼遇到多個(gè)控件同時(shí)修改同一個(gè)模型的場(chǎng)景立刻亂套因?yàn)槟愫茈y判斷當(dāng)前這個(gè)舊值到底對(duì)應(yīng)哪個(gè)狀態(tài)節(jié)點(diǎn)。第二類是臟標(biāo)記管理混亂。正規(guī)一點(diǎn)的編輯器都會(huì)在標(biāo)題欄顯示未保存的狀態(tài)撤銷到初始狀態(tài)時(shí)要把這個(gè)標(biāo)記清掉。自己寫撤銷棧的人通常是在每個(gè)命令里手動(dòng)維護(hù)一個(gè) bool改來改去很容易漏掉某個(gè)分支最后出現(xiàn)文檔明明恢復(fù)原樣卻還提示未保存的詭異表現(xiàn)。第三類是多窗口協(xié)作基本沒法做。一個(gè)多文檔編輯器往往要同時(shí)打開好幾個(gè)文件如果每個(gè)文件各自維護(hù)一套撤銷邏輯那撤銷到底撤銷哪個(gè)窗口是全局只允許一個(gè)活動(dòng)窗口能撤銷還是每個(gè)窗口互相獨(dú)立沒有統(tǒng)一抽象的時(shí)候這個(gè)問題會(huì)被你以各種丑陋的方式臨場(chǎng)處理。QUndoStack 之所以值得專門寫一篇就是因?yàn)樗焉厦孢@三塊都兜住了命令對(duì)象里既有數(shù)據(jù)又有行為stack 自帶干凈狀態(tài)標(biāo)記QUndoGroup 還能把多個(gè)文檔的撤銷棧組織在一起統(tǒng)一管理。2. QUndoStack 核心設(shè)計(jì)思路拆解2.1 命令模式把一次操作封裝成一個(gè)對(duì)象QUndoStack 的設(shè)計(jì)藍(lán)本來自經(jīng)典的設(shè)計(jì)模式——命令模式。它不像快照那樣保存結(jié)果而是把產(chǎn)生結(jié)果的動(dòng)作保存下來。每個(gè)動(dòng)作在代碼里對(duì)應(yīng)一個(gè) QUndoCommand 的子類這個(gè)子類至少要實(shí)現(xiàn)兩個(gè)虛函數(shù)class MyCommand : public QUndoCommand { public: void undo() override { // 撤銷這個(gè)操作時(shí)執(zhí)行什么 } void redo() override { // 重新執(zhí)行或者首次執(zhí)行這個(gè)操作時(shí)執(zhí)行什么 } };這里有個(gè)很多人一開始會(huì)繞不清的點(diǎn)reda() 不只是重做時(shí)調(diào)用它同時(shí)也是命令第一次被 push 進(jìn)棧時(shí)立刻執(zhí)行的那個(gè)入口。換句話說當(dāng)你把一個(gè)命令交給 QUndoStack 時(shí)stack 會(huì)先調(diào)用這個(gè)命令的 redo() 把操作真正落到數(shù)據(jù)上然后再把它放進(jìn)撤銷棧。這樣設(shè)計(jì)的好處是無論第一次執(zhí)行還是 n 次重做走的是同一條代碼路徑邏輯天然統(tǒng)一。命令對(duì)象里保存的應(yīng)當(dāng)是執(zhí)行和撤銷所需的全部信息。比如移動(dòng)一個(gè)圖元你要么保存圖元移動(dòng)前后的兩個(gè)坐標(biāo)要么保存圖元的 id 加新的位置這樣 undo 才能找到它并把坐標(biāo)改回去。QUndoCommand 的構(gòu)造參數(shù)里可以傳入一段文本描述比如移動(dòng)圖元插入表格這段文本不只是給人看的它直接出現(xiàn)在菜單按鈕的文案里這個(gè)后面會(huì)講。2.2 雙棧模型undo 棧、redo 棧與索引QUndoStack 內(nèi)部實(shí)際上維護(hù)了兩個(gè)邏輯棧一個(gè)裝已經(jīng)執(zhí)行、可以被撤銷的命令另一個(gè)裝被撤銷過、可以重做的命令。你按下撤銷它從 undo 棧頂彈出一個(gè)命令并調(diào)用它的 undo()然后把命令扔進(jìn) redo 棧按下重做則是反著來。兩個(gè)棧之外還有一個(gè)關(guān)鍵的索引狀態(tài)它是理解 QUndoStack 的鑰匙??梢园衙铌?duì)列想象成一條時(shí)間軸當(dāng)前索引表示現(xiàn)在處于歷史節(jié)點(diǎn)的哪個(gè)位置。每次 push 新命令index 就前進(jìn)一格同時(shí) redo 棧被整體清空——因?yàn)闅v史已經(jīng)被新的分支配改變了之前的重做路徑不再有效。與之相關(guān)的幾個(gè)查詢接口都很常用index()返回當(dāng)前索引位置。count()返回命令隊(duì)列總長(zhǎng)度undo 棧長(zhǎng)度 redo 棧長(zhǎng)度。undoText()/redoText()返回下一步撤銷 / 重做操作所對(duì)應(yīng)的命令文本。canUndo()/canRedo()判斷當(dāng)前是否有可撤銷 / 可重做的命令。這些接口是給你做 UI 聯(lián)動(dòng)用的。比如按鈕的 enabled 狀態(tài)、菜單里的動(dòng)態(tài)文案撤銷 移動(dòng)圖元都可以直接從這幾個(gè)方法里取得不需要自己額外記錄狀態(tài)。2.3 命令的所有權(quán)與生命周期規(guī)則QUndoStack 有個(gè)內(nèi)存管理規(guī)則剛開始容易踩通過push()傳入的命令其所有權(quán)會(huì)轉(zhuǎn)移給 stack由 stack 負(fù)責(zé)在合適的時(shí)候刪除。你不需要手動(dòng)delete也絕不能在 push 之后繼續(xù)持有并使用那個(gè)裸指針除非你明確知道 stack 還沒清理它。對(duì)于一段代碼來說這意味著你應(yīng)當(dāng)把命令對(duì)象當(dāng)作一次性消耗品。正確寫法是QUndoStack *stack new QUndoStack(this); auto *cmd new EditTextCommand(m_model, m_id, oldText, newText); stack-push(cmd);如果你還持有另一個(gè)cmd的引用后續(xù)一旦用戶撤銷、重做或者 stack 達(dá)到 undo 上限Qt 會(huì)把不再需要的命令從內(nèi)存中清掉那個(gè)引用就成了懸空指針。我見過一些代碼為了復(fù)查命令狀態(tài)而保存命令指針結(jié)果偶發(fā)崩潰排查半天才發(fā)現(xiàn)是緩存了 stack 自己管理的對(duì)象。3. 實(shí)操落地為你的應(yīng)用接入一套完整撤銷體系3.1 兩種典型命令對(duì)象的寫法以圖形編輯器為例子最常見的兩個(gè)操作是添加圖元和移動(dòng)圖元。添加圖元的命令可以這樣寫class AddItemCommand : public QUndoCommand { public: AddItemCommand(ShapeModel *model, const ShapeItem item, QUndoCommand *parent nullptr) : QUndoCommand(QStringLiteral(添加圖元), parent) , m_model(model) , m_item(item) { } void undo() override { m_model-removeItem(m_item); } void redo() override { m_model-addItem(m_item); } private: ShapeModel *m_model; ShapeItem m_item; };這個(gè)命令保存了模型指針和完整的圖元數(shù)據(jù)。redo 時(shí)把它加進(jìn)去undo 時(shí)把它刪掉。關(guān)鍵的細(xì)節(jié)是m_model 指針必須指向一個(gè)在命令生命周期內(nèi)始終有效的對(duì)象。如果模型隨著文檔關(guān)閉而銷毀而命令棧還沒清空把舊的 AddItemCommand 留著繼續(xù)用就出問題了。這一點(diǎn)后面避坑部分會(huì)重點(diǎn)展開。移動(dòng)圖元命令稍微復(fù)雜一點(diǎn)它牽扯到一個(gè)重要機(jī)制命令合并。用戶用鼠標(biāo)拖動(dòng)一個(gè)圖元時(shí)鼠標(biāo)通常會(huì)產(chǎn)生幾十上百個(gè)移動(dòng)動(dòng)作如果每個(gè)移動(dòng)事件都塞進(jìn)一個(gè)獨(dú)立命令撤銷一次只回退幾個(gè)像素用戶會(huì)崩潰。合理的做法是讓同一次拖動(dòng)產(chǎn)生的所有移動(dòng)合并成一個(gè)命令。class MoveItemCommand : public QUndoCommand { public: enum { CommandId 1024 }; MoveItemCommand(ShapeModel *model, int itemId, const QPointF from, const QPointF to, QUndoCommand *parent nullptr) : QUndoCommand(QStringLiteral(移動(dòng)圖元), parent) , m_model(model), m_itemId(itemId) , m_from(from), m_to(to) { } int id() const override { return CommandId; } bool mergeWith(const QUndoCommand *other) override { auto *cmd static_castconst MoveItemCommand *(other); if (cmd-m_itemId ! m_itemId || cmd-m_model ! m_model) return false; // 把上一次的終點(diǎn)作為新命令的整體終點(diǎn) m_to cmd-m_to; return true; } void undo() override { m_model-setItemPos(m_itemId, m_from); } void redo() override { m_model-setItemPos(m_itemId, m_to); } private: ShapeModel *m_model; int m_itemId; QPointF m_from; QPointF m_to; };mergeWith 的邏輯是當(dāng)新命令的 id 與棧頂命令相同并且操作對(duì)象也一致時(shí)把新命令的信息合并進(jìn)舊命令然后返回 true這樣新命令就不會(huì)作為獨(dú)立節(jié)點(diǎn)入棧了。on r拖動(dòng)場(chǎng)景里第一次 move 事件產(chǎn)生的命令作為起點(diǎn)后續(xù)每一次 move 都嘗試合并最終保留了起點(diǎn)和終點(diǎn)撤銷一次就能讓圖元回到拖動(dòng)前的位置。3.2 push 命令的正確時(shí)機(jī)與撤銷棧的配套設(shè)置命令定義好之后業(yè)務(wù)代碼里的調(diào)用方式很直接QUndoStack *m_stack new QUndoStack(this); m_stack-setUndoLimit(100); // 最多支持 100 步撤銷防止內(nèi)存膨脹 void addItem() { ShapeItem item createItemByUserInput(); auto *cmd new AddItemCommand(m_model, item); m_stack-push(cmd); // push 會(huì)自動(dòng)執(zhí)行 redo() } void onUndo() { m_stack-undo(); } void onRedo() { m_stack-redo(); }兩個(gè)設(shè)置值得說明。setUndoLimit是必備的。如果不限制用戶連續(xù)操作幾小時(shí)后撤銷??赡芾鄯e上千條命令內(nèi)存開銷和查找成本都會(huì)上升。文本編輯器可以給更大的額度圖形應(yīng)用通常 100 到 200 步就足夠因?yàn)閳D形操作的成本比文本行高得多。還有一個(gè)容易被忽略的細(xì)節(jié)push()本身就會(huì)執(zhí)行 redo()所以業(yè)務(wù)代碼里千萬不要在 push 之前先手動(dòng)調(diào)用一次 redo()否則同一個(gè)操作會(huì)被執(zhí)行兩次。這個(gè)錯(cuò)誤在團(tuán)隊(duì)協(xié)作的代碼評(píng)審里經(jīng)常出現(xiàn)因?yàn)樗粫?huì)崩潰只是數(shù)據(jù)出現(xiàn)雙重修改表現(xiàn)很隱蔽。另外stack 一般用new QUndoStack(this)掛在主窗口對(duì)象底下隨窗口生命周期走即可。如果你在一個(gè)文檔類里面使用它注意文檔關(guān)閉時(shí)要主動(dòng)清理或銷毀 stack別只刪了數(shù)據(jù)模型把棧晾在一邊。3.3 宏命令把一組操作打包成一個(gè)撤銷單元真實(shí)的應(yīng)用場(chǎng)景很少是單命令操作。用戶在屬性面板里可能一口氣改了文字內(nèi)容、字體大小、顏色然后打開預(yù)覽。如果撤銷只能回退到改顏色之前而把改文字和改字號(hào)留在歷史里體驗(yàn)很奇怪。用戶預(yù)期的是一整次屬性編輯作為一個(gè)撤銷步驟。QUndoStack 用 beginMacro / endMacro 解決這個(gè)問題m_stack-beginMacro(QStringLiteral(調(diào)整圖元屬性)); auto *cmd1 new ChangeTextCommand(m_model, itemId, oldText, newText); auto *cmd2 new ChangeSizeCommand(m_model, itemId, oldSize, newSize); auto *cmd3 new ChangeColorCommand(m_model, itemId, oldColor, newColor); m_stack-push(cmd1); m_stack-push(cmd2); m_stack-push(cmd3); m_stack-endMacro();這段代碼執(zhí)行后撤銷棧里只出現(xiàn)一個(gè)節(jié)點(diǎn)文本顯示調(diào)整圖元屬性。撤銷一次三個(gè)命令按相反順序依次 undo重做時(shí)按正序依次 redo。宏命令本質(zhì)上是構(gòu)造了一個(gè)復(fù)合的 QUndoCommand內(nèi)部自動(dòng)管理所有子命令的生命周期子命令不需要你手動(dòng)釋放。宏命令的嵌套也是允許的但建議在實(shí)際代碼里嚴(yán)格控制嵌套層級(jí)盡量避免 3 層以上否則排查歷史問題時(shí)定位成本很高。4. 集成到界面Action、歷史面板與多窗口協(xié)作4.1 用 createUndoAction 統(tǒng)一管理按鈕和快捷鍵手工維護(hù)撤銷按鈕的狀態(tài)是件麻煩事你要在每次 push、undo、redo 后檢查 canUndo() 并更新按鈕 enabled 屬性。QUndoStack 提供了現(xiàn)成的動(dòng)作工廠方法QAction *undoAction m_stack-createUndoAction(this, tr(撤銷)); QAction *redoAction m_stack-createRedoAction(this, tr(重做)); undoAction-setShortcut(QKeySequence::Undo); redoAction-setShortcut(QKeySequence::Redo); ui-undoButton-setDefaultAction(undoAction); ui-redoButton-setDefaultAction(redoAction);這里有個(gè)很貼心的細(xì)節(jié)createUndoAction 生成的 action其文本會(huì)被自動(dòng)更新為類似撤銷 移動(dòng)圖元的形式前提是命令構(gòu)造時(shí)傳了移動(dòng)圖元作為描述文本。用戶從按鈕或菜單上能直接看到下一步會(huì)被撤銷的具體操作這是很多自定義方案做不到的。動(dòng)作的 enabled 狀態(tài)同樣由 stack 自動(dòng)維護(hù)你不需要連接任何信號(hào)去做手動(dòng)更新。4.2 QUndoView給用戶一個(gè)可點(diǎn)擊的歷史面板除了工具欄上的兩個(gè)按鈕某些高級(jí)工具還會(huì)提供撤銷歷史面板讓用戶看到完整的操作記錄并可以直接點(diǎn)擊跳回任意歷史節(jié)點(diǎn)。QUndoView 是官方提供的成型組件auto *historyView new QUndoView(m_stack); historyView-setWindowTitle(tr(歷史記錄));把它放進(jìn)一個(gè)側(cè)邊??看翱谟脩裟芸吹矫盍斜睃c(diǎn)擊任意節(jié)點(diǎn)即可把文檔回退或推進(jìn)到該位置。這個(gè)組件的底層實(shí)現(xiàn)其實(shí)就調(diào)用了 stack 的setIndex()所以你也完全可以在自己的界面里通過操作索引實(shí)現(xiàn)同樣的跳轉(zhuǎn)。4.3 QUndoGroup多文檔窗口的撤銷狀態(tài)協(xié)調(diào)多文檔編輯器下每個(gè)窗口各持有一個(gè) QUndoStack這時(shí)候麻煩來了菜單欄上只有一個(gè)撤銷按鈕到底控制哪個(gè)文檔QUndoGroup 就是用來解決這個(gè)問題的。把所有文檔的 stack 注冊(cè)進(jìn)同一個(gè) group然后由 group 統(tǒng)一暴露動(dòng)作QUndoGroup *m_undoGroup new QUndoGroup(this); void openDocument(DocumentWindow *win) { m_undoGroup-addStack(win-undoStack()); m_undoGroup-setActiveStack(win-undoStack()); }group 會(huì)跟蹤當(dāng)前活動(dòng)窗口對(duì)應(yīng)的 stack。當(dāng)用戶切換窗口時(shí)group 自動(dòng)把 activeStack 切到新窗口的 stack菜單上的撤銷和重做按鈕文案、啟停狀態(tài)隨之聯(lián)動(dòng)不需要你手工在窗口切換信號(hào)里寫一堆更新邏輯。多個(gè)動(dòng)作按鈕也需要重新綁定到 groupQAction *undoAction m_undoGroup-createUndoAction(this, tr(撤銷)); QAction *redoAction m_undoGroup-createRedoAction(this, tr(重做));還有一個(gè)加分用法QUndoGroup支持跨窗口撤銷。某些設(shè)計(jì)工具允許撤銷上一個(gè)操作即使那個(gè)操作發(fā)生在另一個(gè)文檔里用戶在多個(gè)文件之間切換操作時(shí)可以跨文檔回退。group 內(nèi)部會(huì)自動(dòng)通過setActiveStack決定當(dāng)前作用于哪個(gè)棧你只需要復(fù)用同一個(gè) undo 快捷鍵就行。5. 常見問題與排查技巧實(shí)錄5.1 撤銷后界面不刷新或者數(shù)據(jù)錯(cuò)位的排查方向撤銷操作執(zhí)行的是命令里的 undo() 邏輯它直接修改模型數(shù)據(jù)。如果視圖沒有跟著刷新通常不是 QUndoStack 的問題而是模型沒有發(fā)出正確的變更信號(hào)。命令里操作模型之后要確保調(diào)用對(duì)應(yīng)的beginResetModel()、dataChanged()、layoutChanged()等信號(hào)讓視圖重新拉取數(shù)據(jù)。一個(gè)我踩過的細(xì)節(jié)有些人在構(gòu)造命令時(shí)把模型指針存了下來但模型內(nèi)部的數(shù)據(jù)容器在操作后發(fā)生了重建比如重新加載了文件舊命令里的索引或?qū)ο笾羔樢呀?jīng)不再指向有效元素。此時(shí)撤銷一個(gè)刪除節(jié)點(diǎn)命令可能把不相關(guān)的數(shù)據(jù)刪掉。解決辦法是命令內(nèi)保存業(yè)務(wù)對(duì)象的穩(wěn)定 id 而不是指針執(zhí)行 undo / redo 時(shí)通過 id 去模型里重新查找對(duì)象。5.2 打開新文檔后歷史命令污染新數(shù)據(jù)的處理這是多文檔應(yīng)用最常見的事故。用戶在文檔 A 做了幾步操作然后打開新文檔如果文檔關(guān)閉時(shí)沒有清空 QUndoStack那么新文檔一上來就可以撤銷上一步——但執(zhí)行的是針對(duì)舊文檔的命令。undo() 里的模型指針可能恰好指向新文檔的數(shù)據(jù)結(jié)果產(chǎn)生完全錯(cuò)亂的數(shù)據(jù)。保證安全的做法是關(guān)閉文檔時(shí)顯式清理撤銷棧??梢赃x擇把 stack 作為文檔窗口的子對(duì)象銷毀也可以在加載新文檔前調(diào)用m_stack-clear();clear()會(huì)刪除所有命令并重置 index同時(shí)自動(dòng)關(guān)閉宏命令如果正處于 beginMacro 中間的話。這行代碼建議統(tǒng)一放在文檔已加載成功之后調(diào)用避免在加載過程中出現(xiàn)不可撤銷的中間狀態(tài)。5.3 命令合并的邊界條件與高頻命令的性能問題mergeWith 寫得不好會(huì)把不該合并的命令合并掉導(dǎo)致用戶撤銷過頭。guard 條件一定要做嚴(yán)謹(jǐn)我通常要求三個(gè)條件同時(shí)滿足id 相同、操作對(duì)象相同比如圖元 id、文本指針、業(yè)務(wù)類型一致。對(duì)于不同圖元同時(shí)移動(dòng)的情況如果不比較 itemId兩個(gè)圖元的移動(dòng)命令就會(huì)被疊加成一個(gè)撤銷時(shí)就是兩個(gè)圖元一起跳表現(xiàn)非常詭異。高頻命令的另一個(gè)性能陷阱是宏命令包得過大。比如一個(gè)屬性對(duì)話框的確認(rèn)按鈕理論上應(yīng)該把用戶點(diǎn)擊確認(rèn)作為一個(gè)整體步驟但如果在拖動(dòng)滑塊的過程中就不斷 beginMacro / endMacro生成大量小型宏命令撤銷歷史會(huì)冗余。合理的做法是連續(xù) slider 拖動(dòng)期間允許命令合并等釋放鼠標(biāo)時(shí)強(qiáng)制產(chǎn)生一個(gè)邏輯斷點(diǎn)這樣既保證撤銷粒度合理又避免命令數(shù)量爆炸。5.4 撤銷棧的保存與恢復(fù)跨會(huì)話的歷史能保嗎有些軟件支持把撤銷歷史隨文檔一起保存下次打開還能繼續(xù)撤銷。QUndoStack 本身沒有內(nèi)置序列化接口你需要自己實(shí)現(xiàn)。常見做法是給每個(gè)命令增加序列化方法把命令類型、參數(shù)、時(shí)間戳寫進(jìn)文檔格式加載時(shí)重新構(gòu)造命令并 push 到新 stack 中。但這么做有個(gè)要警惕的坑恢復(fù)命令會(huì)執(zhí)行一次 redo()如果你在加載流程里把 push 當(dāng)作簡(jiǎn)單入棧處理會(huì)重復(fù)執(zhí)行命令導(dǎo)致數(shù)據(jù)疊加。所以加載歷史時(shí)要么先讓模型處于尚未加載狀態(tài)等命令依次執(zhí)行后再呈現(xiàn)要么恢復(fù)歷史前先取消命令的立即執(zhí)行行為這需要你對(duì) stack 的機(jī)制理解到位后再動(dòng)手。5.5 常見問題速查表癥狀可能原因解決思路撤銷按鈕一直是灰色的命令從未成功 push或 stack 被 clear 過檢查業(yè)務(wù)代碼是否真的調(diào)用了 push檢查宏命令是否未正確結(jié)束撤銷一步界面變化了兩步的幅度命令合并條件過于寬松收緊 mergeWith 的 guard目標(biāo)對(duì)象 id、模型指針必須一致撤銷后視圖數(shù)據(jù)錯(cuò)亂命令保存的是裸指針或舊索引改為保存業(yè)務(wù)對(duì)象 idundo/redo 時(shí)重新查找打開新文檔后能撤出舊操作舊文檔的 stack 未清空文檔加載成功后調(diào)用 stack-clear()push 后數(shù)據(jù)出現(xiàn)雙份代碼調(diào)用了兩次 redo 或重復(fù) push記住 push 自帶執(zhí)行邏輯不要二次手動(dòng)調(diào)用undo 時(shí)程序崩潰命令持有已銷毀對(duì)象的指針審視命令生命周期保證模型銷毀前清空命令棧在實(shí)際項(xiàng)目里我發(fā)現(xiàn) QUndoStack 最難的地方從來不是 API 本身而是想清楚一個(gè)命令到底應(yīng)該攜帶哪些信息、合并到什么粒度。寫命令類之前先把業(yè)務(wù)對(duì)象的身份標(biāo)識(shí)、模型的生命周期、用戶期望的撤銷粒度這三件事定下來后面的代碼基本水到渠成。如果你只是臨時(shí)解決一個(gè)編輯器的撤銷需求直接按這篇文章的示例擼一套出來足夠應(yīng)付大多數(shù)場(chǎng)景如果你的項(xiàng)目后續(xù)要做多文檔協(xié)作、持久化歷史這類高級(jí)功能也建議從第一天就把命令模式立好別等代碼堆到幾千行再回頭重構(gòu)——那時(shí)候改造成本遠(yuǎn)比你想象的高。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月婷婷综合激情| 丁香六月在线| 丁香婷婷五月天网站| 亚洲国产精品VA在线看黑人| 91九色国产| 这里只有精品视频国产| 人人澡玖玖一| 99热加勒比| 97在线精品| ss视频xx91| 九九热啪啪| 欧美日本不卡黄色片| 超碰人人在线| 五月婷中文字幕| 69婷婷丁香午夜| 99综合网| 9l视频自拍9l九色成人| 69久久99精品久久久久婷婷| 六月色婷婷综合影视| 九色婷婷| 婷婷在线精品| 天天操天天操天天操天天操天天操 | 婷婷激情五月天小说| 婷色五月| 99亚洲精品| 91九色中文字幕女在线观看| 另类综合色| 日夜夜天天| 色婷婷av在线观看| 欧美性爱五月天| 丁香五月婷婷影院| 十区av| 亚洲精品无AMM毛片| www.91操| 99在线观看| 99色在线| 五月99久久| 五月天色婷婷成人| 欧美成人网99网| 九九成人精品| 思思久久青草热| 丁香五月成人论坛| www·五月天| 五月开心婷婷网| 五月综合激情| 亚洲AV成人片无码网站| 2015好吊操| 色综合九九色综合88| 婷婷五月欧美| 激情宗合 激情宗合| 综合狠久久| 国外亚洲成AV人片在线观看 | 91综合网| 久久激情五月网| 五月丁香 狠狠爱| A片试看120分钟做受图片| 51国精产品自偷自偷综合 | 99爱在线视频| 双性美人被调教到喷水A片| 91热爆在线| 五月天色色网站| 在线看片av| 精品久久久999| 五月婷视频在线| 操操操Av| 天天狠狠夜夜狠狠2023| 国产偷人爽久久久久久老妇APP| 五月天激情图片| 淫视馆aV二区一区| 青青久在线视频免费观看| 色一情一乱一伦一区二区三区| 五月综合视频| 九97免费视频| 久久久999精品| 超碰人人艹| av大香蕉| 五月丁香五月激情综合色综合| 插少妇综合网| 无码髙清| 欧美搡BBBBB摔BBBBB| 无码少妇高潮喷水A片免费| 日本欧美成人片AAAA| 97色婷婷| 夜夜大香蕉婷婷丁香| 欧美日本黄色| 国产精品久久久丁香五月八戒视频| 欧美天天干天天草| 999热在线视频| 性一交一乱一交A片久久四色| 五月天婷婷综合网| 久久人操-久草婷婷-成人AV| 这里只有精品视频视频在线观看| 国内精品玖玖| 久久久婷婷婷| 色综合五月| 色伊人啪| 狠狠操狠狠狠| 久久婷婷网| 最近中文字幕大全免费版在线 | 六月色婷婷综合影视| 亚洲啪啪啪啪| 视频色色色色色色| 亚洲视频一区| 99热大香蕉| 欧美天天爽| 五月婷综合网| 无码色| 丁香五月狠狠在线观看| 亚洲色碰| 无码区婷婷五月花开| 婷婷六月色开| av人人操| 先锋男人99资源| 中文av网| 人碰人人人玩91| 九九热re99re6在线精品| XXXX岛国| 九九色99| 伊人久久综合| 色爱终和网| 97AV在线视频| 色婷婷影| 婷婷五月深爱五月| 国产亚洲精品久久久久久郑州| 超碰碰碰碰| 丁香激情四射| 色五月婷婷丁香凹凸| 久久加勒比| 九九热只有精品6| 99爱精品| 综合另类激情| 99er在线观看| 乱精品一区字幕二区| 日韩五月婷婷| 丁香五月中文字幕久色| 国产精品18久久久| mmm1717.6dbm人人爱人人操| 色综合久久888| 久婷婷视平| www.狠狠| 亚洲超碰在线| 色欲天天综合| 五月丁香综合啪啪| 91婷婷丁香五月| 影音先锋人妻出差| 久在线88综合| 91啪级电影| 中文字幕在线免费观看视频| 激情九月天天天天婷婷| 五月丁香六月婷婷姐| 日本欧美成人片AAAA| 超碰人人操在线| 五月婷婷69| 成人精品视频99在线观看免费| 天天搡日日搡aaaaⅩ| 激情伊人五月天| 无码激情AAAAA片-区区| 99热这里只有精品96| 亚洲操b| 亚洲国产网站| 久久a热| 色五月丁香A欧美com| 婷婷,五月天,丁香,第一| 国产精品色婷婷久久久精品| 六月婷婷香蕉| 色色五月丁香婷婷| 色婷五月| 五月丁香啪| 丁香色色网| 大香蕉五月婷婷| 丁香五月九九| 99超级碰碰| 欧美啪啪网| 天干夜夜操| 麻豆忘忧草午夜| 色色综合视频| 人人干人人操外国| 超碰在线观看9| 久七香蕉| 久色网址| 激情宗合哪里能看| 男女啪啪做爰高潮无遮挡| 丁香五月花婷婷开心| 人人操日| 琪琪理论片| 五月婷婷六月激情| 色99欧洲色19| 免费黄色AV| 丁香婷婷色色| 五月丁香六月激情综合网| 久久九九色| 99色这里| 色五月美女| 婷婷五月丁香六月综合网| AV在线二十六页| 婷婷五月丁香伊人| 色九亚洲| 五月天色综合| 99这里只有精品|v| 色五月大香蕉| 久久五月婷天天干| 岛国午夜视频| 婷婷99视频精品| 久久激情五月| 一本色道久久综合狠狠躁一二三| 日日噜狠狠色综合久| 天天插天天射天天干| 国产在线黄色| 26uuuavcom| 99久久超级| 色五婷婷开心缴| 久久精品99久久| 婷婷综合| 国产日韩亚洲欧美在线观看| 91超碰九色| 99色综合| 五月天丁香久久| 天天想夜夜爽天天爽| 亚洲欧洲中文日韩久久AV乱码| 激情五月婷在线精品| 成人在线视频一区| 久热99| 麻豆五月丁香婷婷| 五月丁香婷婷久久| 婷婷视频在线碰| 夜夜爽天天干| www.婷婷五月天啪啪| 99在线看视频| 丁香五月婷婷五月| 91九色国产熟女| 老司机午夜福利视频金瓶梅| 天天色99| 亚洲天堂色| www.婷婷五月天| 久久午夜理论| 五月天色色色| 九九九午夜视频| 99自拍视频在线观看| 色婷婷六月开心中文字| 大香蕉人妻| 色九四色| 丁香网站| 日日爽日日| 久久激情五月婷婷| 天天干天天爽天天爽| 另类综合激情| 五月丁香综合影院| 超碰免费电影| 五月婷婷视频| www.夜夜| 天天操夜夜操| 亚洲中文字幕av| 五月天狠狠草| 婷婷六月天激情影院| 99视频自拍| cao视频,现在观看| 偷拍九九热| 在线综合网| 久色大| 久久这里只有国产精品视频| 91热er| 久久久性爱网| www.yw色| 操逼巨乳91| 婷婷99视频在线| 人人摸人人摸| 丁香成人五月天| 久热免费视频| 丁香六月婷婷五月婷婷| 五月婷婷六月丁香综合| 色99热| 婷婷丁香五月天在线视频| 99热最新精品| 黄色三级日本| 狠狠丁香| 91欧美| 色综合久久88色综合天天看| 免费成人网在线观看| 玖玖婷婷免费| 这里只有精品96| 婷婷久久五月天| 亚洲综合五月天婷婷丁香| 九九这里都是精品| 婷婷爱五月天| 久久九九@| 激情五月天 婷婷| 俺去啦综合网| 欧美成人五月天| 丁香五月亚洲天堂| 色综合久久88色综合天天99| 囯产精品久久欠久久久久久九大| 无码色| 色婷婷五月天偷拍| 激情啪啪五月| 久久人人看| 日本激情91| 激情人妻综合| 狠狠狠狠狠狠狠狠| 五月婷丁香| 99激情视频| 九九热精品| 99这里有精品| 91男人资源站| 激情亚洲婷婷| Xx色综合| 噜噜噜噜在线| 五月丁香六月婷婷国产视频| 丁香婷婷九月| 九九热视频精品| 成人丁香五月| 国产一二区爆乳_1国产日韩一区二区三-成人AV | 9视频在线成人网站| 日韩av一区二区在线/日产精品久久久| 欧美在线视频99| 在线观看免费视频| 色噜婷婷| 99精品热| 天天综合干| 五月天婷婷色小说| 五月丁香影院| 色婷婷狠狠18禁| www.婷婷| 金品在线视频99| 91精品久久久久久久久| wwW天天干| 五月丁香av在线| 婷婷五月天激情丁香| 色五婷婷开心缴| 欧洲不卡视频| 九九色情网站| 青青草tp| 久热这里只有精品视频6| 日日爱699| 亚洲成人网站在线播放| 国产全是老熟女太爽了| 99亚洲精美视频在线观看| 狠狠色丁香| 天天色天天爱天天爽| 婷婷五月天视频| 色色色色色色网站| 99婷婷色| 色色色综合视频| 五月丁香六月婷婷综合| 丁香五月综合| 亚洲Av成人在线观看| 五月天色色色| 天天爽天天爽视频| 99re在线播放| 97超碰在线免费观看| 色五月婷婷少妇人妻| 九九99一区| 欧美日韩成人| 婷婷色色丁香| 色综合五月在线| 人人操五月天| 丁香五月天久久| 大香av| 色综合色综合色综合高潮| 五月丁香六月激情欧美综合| 国产真人做爰视频免费| 亚洲午夜视频| 五月叮香啪| 久99热| www.99精品视频| 99热这只有| 五月丁香久人妻中文| 日韩在线观看网址| 99re思思| 熟女激情网| 级人人91| 亚洲色五月天是什么| 丁香激情五月| 色吊丝99| 夜夜操狠狠操天天操| 91精品久久久久| 婷婷日本色| 亚洲色爽| 泰州成人视频| 黄网网站在线播放| 色五月偷偷| 婷婷最新地址| 国产六月婷婷| 99色在线观看| 这里只有精彩小视频视频网站| 操骚货在线| 嫩模草| 丁香婷婷五月天色综合| 色999五月色| 99久久五月天| 久久视频这里有精品99| 99re久热| 日韩在线婷婷五月天综合| 六月丁香五月婷婷| 五月天婷亚洲天综合网综合 | 五月天丁香成人| 天天日日| 色五婷婷| 亚洲欧美日韩另类| 99热这里全是精品| 久久五月婷综合网| 真实亲子乱子伦高清在线观看| 电影91久久久| 色情激情五月| 色婷婷网大全在线| 国色天香伊人狠狠色| 日本精品人妻无码77777| 激情六月丁香综合| 五月天综合网| 激情婷婷综合| 九九综合影音先锋 | 97婷婷五月丁香| 五月综合激情综合久| 丁香五月影院| 怡红院精品视频久久久久久久久| 亚洲欧洲中文日韩久久AV乱码| 影音先锋女人av鲁色资源网小说免费| 六月激情综合| 婷婷丁香六月影视| 人人插操| 九一99| 超碰免费人人肏| 日日激情网| www.99.色| 天天干天天爽天天操| 人人摸人人干| 99热这里| 精热在线综合网| 国产精品美女| 久久99成人性爱高清视频| 67194线路二在线观看| 九九色视频| 大香伊人婷婷| 99热9| 婷婷五月天激情网址| 国产免费一区二区在线A片视频| 综合激情五月综合激情五月激情1 天天爱天天做天天舔 | 激情视频网址| 激情久久久| 色婷綜合网| 九色99视频| 在线观看中文字幕| 婷婷色网| 99欧美热| 操操国产| 欧美色六月婷婷| 亲子乱AV-区二区三区| 五月激情小说网| 五月天开心色情网| 亚洲日韩一页精品发布| 五月天啪啪| 色激情五月| 五月激情站| 婷婷六月激情丁香| 91九色中文字幕女在线观看| 激情五月激情综合网| 久久九九大香蕉电院| 久草五月婷| 99人妻碰碰碰久久久久禁片| 无码婷婷五月天| 天天综合网~91| 久久五月天婷婷| 久久香蕉婷婷五月天| 91在线观看www| 91丨九色丨大屁股| 亚州精品久久久久AV无码| 玖玖99精品视频| 久久久久人妻| 精品无吗va视频免费观看| 久久久激情| 婷婷五月丁香四射| 激情五月天婷婷| 天天日夜夜帕| 同性gv国产精品一区二区| 大香蕉伊然在亚洲90| 色婷婷亚洲精品天天综| 久久色情综合免费网站| 日本精品。999| 九九99在线视频| 天天做天天爱天天高潮| 亚洲不卡| 激情文学五月丁香六月婷婷| 婷婷六月丁香色| 射琪琪| 国产欧美熟妇另类久久久| 天天骑天天操| 婷婷色五月色妇| 婷婷射图五月天| 成人在线观看精品| 色色色网站| 色色日本| 色播婷婷五月天| 婷婷五月色| 性色综合网| 亚洲V国产V欧美V久久久久久| 日本WWW九九九| 久久99久久99精品免视看婷婷| 婷婷97碰碰| 影音先锋男人AV资源站| 免费无码毛片一区二区A片| 五月丁香六月成人| 亚洲综合色网| 色五月综合在线| 26UUU亚洲欧美| 996er热| 激情五月天情色| 国产精品99久久久久久久女警| YJLZZJLZZ亚洲乱熟无码| 五月激情婷婷女| 色久播播| 无码se| 婷婷之玖玖| 久久99久久99久久99| 婷婷激情五月| 久久丁香| 色婷婷五月综合| 色婷婷免费视频| 久久婷婷综合五月天| 就去涩涩丁香五月天| 亚洲 激情 中文| 婷婷六月丁香激情| 色五月综合网| 99久.| 99九九玖玖| av人人操| 青青999| 五月婷九月| 久久无码成人| 激情涩播| 99草在线免费观看视频| 激情婷婷五月社区| 色噜婷婷| 伊人玖玖综合| 五月天婷婷爱| 婷婷五月丁香六月| 亚洲欧洲另类| 77799热| 五月丁香婷婷综合在线| 九九99在线观看视频| 超碰在线91| 无码se| 激情五月天色| 99无码免费视频| 色宗合,宗合网| 亚洲激情免费久久| 2025天天爽天天摸| 激情丁香五月婷婷啪啪| 99热在线精品观看| 五月综合在线| 99热这里只有精品22| 91在线日| 高清无码网址| 丁香五月婷婷社区| 热热99爱爱| 1024操逼视频| 婷婷五月天AV网| 777.色色| 婷婷五月偷拍| 色婷婷亚洲婷婷| 91丨九色丨丰满人妖| 国产成人+综合亚洲+天堂| 狠狠五月天| 丁香五月花| 丁香八月综合激情| 色色爽爽天天| 五月丁婷婷| 99这里有精品视频视频| 日本熟妇精品99| 五月天伊人网| 色九九中文字幕| 五月色婷婷夜色| www.五月天婷婷| 色五月综合网| 天天爽天天透天天爱| 这里只有精品免费观看网占| 丁香五月91| 丁香六月激情| 黄页免费一级视频懂色| 亚洲思思热久| 99热这里只有精品最新| 97超碰人人操| 天天干人人奸97| 婷婷娌伦网| 九九热a| 玖久精品视频9| 人妻久久久久久久| 国产成人网| 大香久久综合网| 婷婷五月丁香综合| 就爱射中文字幕资源网| www,久久久| 黄桃AV无码免费一区二区三区 | 99精品久久久久久久婷婷久久| 五月婷婷在线免费| 欧美精品XXXXBBBB| 国产精品国产| 另类激情五月| 久操婷婷| 五月天婷婷激情四射综合| 九月婷婷久久| 碰碰碰91| 丁香婷婷五月天网站| 日日夜夜狠狠| 激情内射人妻1区2区3区| 婷婷激情小说| 超碰93在线观看| 天天天天操| 97碰成超视频免费视频| 狠狠草婷婷| 五月婷婷六月激情| 丁香五月五月婷婷欧美大香蕉| 五月丁香色婷婷色| 婷婷五月天干干| 五月丁香人妻| 激情伊人网| 欧美噜一噜| 99热在这里只有精品| 色婷婷丁香AV综合| 加勒比色色| 久久久WWW| 狠狠综合久久综合| 99re这里有精品手机在线| 五月天社区| 艹天天射| 久久aaaa片一区二区| 天天日夜夜| 99在线观看精品| 五月天社区狠狠| 国产99久久久国产精品免费看| 激情99| 伊人久久丁香婷婷六月五月综合| 免费精品99| 九热久| 99色色色色| 婷婷不干网| 那里有AV网址| 99热18| 五夜丁香| 婷婷开心激情| 丁香五月天亚洲综合| 丁香五月婷婷精品视频| www.五月天| 九九视频免费| 色色亚洲五月天| 五月婷婷偷拍| 婷婷久久精品| 97九色视频| 亚洲va成人va成人va在线观看| 超级碰碰碰久久网站| 亚洲小说欧美激情| 激婷网| 天天天天天操| AA片在线观看视频在线播放| 情五月亚洲婷婷| 99久久综合| 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 九月av在线| 婷婷五月色亚洲| 色色色五月天婷婷| 色婷婷九月| 婷婷狠狠青青| 99色色色色| 91精品丝袜久久久久久久久粉嫩| 婷婷开心激情| 狠狠干综合网| 伊人碰碰碰| 国产67194| 丁香五月激情啪啪| 麻豆科斗777| 日本综合色图| 九九久久综合网站| 久99久视频精选| 开心色五月天久久久久久久| 久久99精品久久久久久青青AR| 91精品综合久久久久久五月丁香| 亚洲视频无| 色婷婷超碰| www.99久| 五月婷婷深深爱| 深爱激情四射| 色播激情| 久久综合丁香| 五月天激情综合首页| 丁香五月影院| 婷婷香五月综合激情| 97婷婷五月| 99热亚洲| 99色这里| 激情九月婷婷九月| 色五月在线观看| Www99热| 欧美婷婷| 99热在线这里只有精品| 成人 九九九九| av在线观看网站| 婷香五月网在线| 日本WwW色偷偷丁香花久久久京东热| 日韩在线aaa| 91肏| 大战熟女丰满人妻AV| 天天操天天操天天操天天操天天操天天操| 六月撸婷婷| 色婷婷成人| 日本VA视频| 久热大香蕉| 五月Huangsewang| 欧美色色色色色色| 婷婷五月天无码视频| 丁香五月婷婷久久久| 亚洲第一黄网| 视色综合| 色综合色综合网| 婷婷色五月大香蕉在线| 色五月成人| 99热精品一| 色V狠狠的干| 国产性av| 色优久久| 婷婷激情五月综合| 99re这里只有精品国产99| 人人操人| 五月天婷婷小说| 五月婷婷综合在线| 婷婷五月开心中文字幕在线| 91精品91久久久中77777久久玖玖九九 | 激情五月综合| 五月婷婷少妇之| 超碰无码318604| 色无婷婷| 久热免费| 亚洲激情五月| 五月丁香九九九综合| 五月婷婷与六月丁香图片激情| 热热色色五月天婷婷| 天干夜夜操| 日韩色色视频| 综合五月激情| 美臀自射自家人妻| 色五月成人| 人妻操日日| 99原创自拍视频在线观看| 97人人干人人操| 直接看的AV| 人人综合五月人人婷婷| 丁香色五月直播| 99久久精品国产色欲| 九热网站| 超喷97免费在线视频| 天天日综合| 91人人操.COM| 色婷婷六月| 色丁香五月天婷婷| 亚洲十月婷婷综合| 亚洲俩性性爱图片久久第六页| 亚洲激情综| ...婷婷五月综合不卡,国产在线手机| 久久大国产香蕉| 99这里有精品| 色五月激情五月| 激情综合啪啪| 婷婷丁香激情综合色情| 五月丁香综合影院| 色婷婷视频在线| 九九热精品6| 激情五月天色婷婷综合| 久久婷婷五月综合色播| 99久久a线观| 欧美成性色| 狠狠大香婷婷爱| 五月婷婷与六月丁香图片激情| 99.N在线视频| 伊人婷婷五月天av| 第1影院之五月婷婷| 九九99九九精品视频| 欧美婷婷丁香社区在线播放| 日韩无码AV电影网站| 少妇真实被内射视频三四区| 亚洲另类在线观看| 俺也去色| 国产SUV精品一区二区6| 北京熟妇搡BBBB搡BBBB| 日产精品一线二线三线芒果| 精国产品一区二区三区A片| 婷婷啪啪| 婷婷五月天综合网| 天天射影院| 99精品偷自拍| 久777| 婷婷丁香大香蕉| 男女av免费看| 婷婷色情五月| 婷婷色吧| 婷婷五月丁香久久| 天天人人综合| 79精品在线视频| 伊人成人宗合网| 五月天电影网| 欧美Va日本Va| 97久久人人操| 五月天婷婷激情| 国产精品久久久久久久久久免费| 射婷婷中文字幕| 91丨九色丨老熟女激情| 99.N在线视频| 大香蕉啪啪网| 激情丰满熟妇五月| 欧美成人网99网| 久久五月天视频| 欧美性丁香色色五月天干干| 欧美成人AAA片一区国产精品 | 开心网五月色婷婷| 久99久99精品免| 色啪网| 五月综合激情婷婷六月色窝| wwwav大香蕉| 日hao1区| 热中文字幕| 色婷婷深爱五月| 亚洲成人噜噜| 日韩在线视频中文字幕| 色婷婷电影网| 丁香av网| 97人人干人人操| 六月丁香婷婷网| 免费不卡狠操美女视频网| AV在线大香蕉| 成人国产欧美大片一区| 免费观看2018www黄色操逼网站| 天堂久久精品| 天天操九九插| 噜啊噜在线| 97在线精品| 久久一操| 色情五月天视频网| 丁香五月六月激情久久| 丁香色色网| 色五月婷婷777| 99在线资源| 色五月婷婷、老熟女| 另类小说色婷婷| 免费黄色片子| 99ri视频在线观看| 亚洲成人网无码| 色久天| 超碰99在线观看| 激情婷婷99| 五月婷婷综合热| 综合五月网| 99免费在线视频| 婷婷五月丁香色综合| 男人天堂亚洲综合| 国产亚洲精品久久一区二区三区| 五月激情开心婷婷| 天天综合精品| 无码激情AAAAA片-区区| 久草视频一,二三四| 成人狠狠成人狠狠成人狠狠成人狠狠| 久久狠狠干| Www.sesese丁香| 久久综合中文| 26uuu欧美日本| 欧美丰满熟妇BBB久久久| 久久色五月天| 婷婷五月天六月| 久久这里只有精品热在99| 日韩久久日| 激情5月婷婷狠狠干| 97人人看| 狠狠久久婷| 日韩六十路91性交电影| 99热官网精品在线| 中文字幕黄色电影网址| 丁香五月亚洲婷婷| 日韩另类| 9操在线| 国产三级秋霞| 99国产在线精品视频| 99精品视频在线观看免费| 五月天六月色| 九九色婷婷Av| 丁香色啪综合| 99热这里只有精品8| 久操97| 五月婷色激情五月| 91 九色大美女| 五月丁香综合网色欲| 亚洲成人一区| 另类激情码| 丁香五月Av| 狠狠婷婷综合| 天天干天天干天天干天天干天天干天天| 久久99精品视频| 午夜丁香综合婷婷| 九九热只有精品| 人人操9| 亚洲五月天狠狠| 欧美大肥婆大肥BBBBB| 伊人五月天综合网| 五月色婷| 成人网址在线观看| 久久五月激情| 五月婷婷人人人操| 99久久www| 九九青草热| 久久精品视频在这里有| 51精品国内探花| 五月开心深深爱激情综合 | 五月停视频天堂| 思思热性操| 久久久99精品免费观看| 99热成人精品| 国产亚洲精品久久久久久郑州| 在线va网站| 大香网伊人久久综合| eeuss人妻| 久色| 色五月丁香五月激情五月激情| 成人AV在线电影| 色9999日韩国产| 天天爱天天做天天操| 五月天日日操夜夜操 | 亚洲激情综合| 入口五月婷婷六月香| 51国精产品自偷自偷综合| 婷婷丁香五月天哟啪| 高清无码网址| 开心五月婷婷六月丁香| 中文字幕精品无码一区二区| 99秘 在线| 色婷小说| 色婷婷久久综合久色综| 一级二级色大片| 4399人妻无码久久久| 五月丁香免费视频| 久热91| 五五月五月| 亚洲图片 丁香婷婷| 日日噜狠狠色综合久| 六月丁香六月婷婷欧美| 久久激情综合| 开心五月丁香综合久久| 久久婷婷超碰| 丁香婷婷六月| 中文字幕在线免费观看视频| 色色色热| 色婷婷色人人射| 综合色色综合| 亚州操人在线视频| 丁香花五月天| 9色在线视频精品观看| 丁香五月天.com| 爱性综合网| 91蝌蚪窝视频在线| 99视频精品在线| 五月丁香成人网| 欧美69久成人做爰视频| 综合激情视频| 97啪啪| 熟女人妻视频| 丁香五月天综合| 青青.com| 91嫩草国产线观看亚洲一区二区| 99精彩视频| 九九蜜臀精品| 91fuliwang| 91色久| 激情五月丁香激情综合网| aaa9区免费在线观看| 夜夜撸日日操| 中文字幕色色| 99综合| 亚洲精品第一国产综合亚AV | 婷婷五月天成人娱乐| 色婷婷激情Av久久久| 91se在线观看| 婷婷亚洲五月丁香综合在线 | 欧洲亚洲激情五月天在线| 超碰97久久| 欧美性做爰大片免费看办公室| 五月婷婷综合在线视频小说| 色丁香五月婷婷| 亚洲超碰青涩| 久久久激情| 免费播放99性爱视频| Av大香蕉| 综合五月激情| 精品人妻一区二区| 日韩三级高清无码| 成人五月天在线视频在线观看| 久久丁香婷婷五月| 国产美女无遮挡裸体毛片A片| 狠狠干综合| 欧美毛片www| 91美女被操| 草榴视频黄色网| 日本婷婷五月天| 日本九婷婷| 五月天婷婷影院影院| 色欲天天综合网| 久久日本wwww色| 色婷五月天| 色婷五月天| 亚洲激情综合五月婷婷啪啪| 亚洲成人免费电影| 九九九九九九综合| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 色情综合网| 色婷婷精品| 巴基斯坦粉嫰无码视频| 91啪啪视频| 光棍影院日韩精品| 综合欧美五月婷婷| 五月天丁香| xxxx久| 五月开心激情| 26UUU精品一区二区Com| 久久久思思热| 亚洲熟女色| 久久五月情| 久热精品免费视频4| 九九色综合| 亚洲激情四射| 欧美五月婷婷| 激情五月婷婷网| 欧美英丁香开心快乐六月天网| 人人干人人干骚美女| 激情婷婷在线中文字幕| 九九色天堂| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 天天日天天爽| 久久99网站| 五月激情婷婷丁香| 色五月色图| 天天做天天爱天天爽| 国产午夜精品久久久观看| 噜噜噜色噜噜| 思思色综合网站| 天天网站天天爽| 国庆精品久久| 欧美va精品va老师va| 91啪啪| 超碰av在线| 久久综合中文| 97操在线视频| 97人人操在线| 99网址在线看| 97干免费视频| 天天射天天干天插色综合| 丁香六月婷| 黄色一级影片| 色色色五月婷| 丁香婷婷色| 激情九月综合| 大香蕉九九| 色色色色热热| 丁香六月色香蕉视频| 《诡秘之主》在线观看 | 99噜噜噜在线播放| 亭亭五月丁香综合欧美| 无码九九| 久月丁香爱婷婷综合| 欧洲精品欧洲情| 人妻内射麻豆视频| 五月色婷婷综合丁香精品无遮挡| 五月婷婷久久激情 | 超碰在线免费9| 欧美综合123区| 婷婷五月丁香久久| 性色欲情 网站| 亚洲色婷婷婷婷人人爽| xxx综合在线| 五月综合六月婷婷| 五月草视频| 中文字幕成人影视| 色999五月色| 日韩啪啪网| 青草青草视频2免费观看| 玖玖爱伊人网| 色综合色综合色综合| 伊人九九综合| 大香蕉精品视频| 包操45分钟网站| 婷婷五月中文字幕国产| 日本久久爱| 操人久久| 色色色色综合网| 熟女少妇内射日韩亚洲| 激情五月最新网址| 高清成人综合| 丁香六月婷婷综情欧美| 婷婷五月天影视| 五月天激情www| 五月婷婷影院| 欧洲色色| 99久久人人| 色噜噜狠狠色综合成人99| 欧美欧盟性爱网| 狠狠插狠狠| 99狠狠| 五月丁香影院| 亚洲日本三级片| 久久久五月五丁香| 婷婷五月丁香综合激情小说| 精品久久66| 超碰在线成人| 日韩久久成人| 婷婷久久内射| 久久一热免费视频| 天天插AV丝袜中| www.zbzhongsen.com| 色色三级视频| 91九色欧美| 婷婷色五月噜噜| 激情五月天伊人影院| 丁香久久| 精品热九九| 中文无码婷婷| 26UUU欧美激情一区二区| 丁香五月社区| 亚洲色五月| 色玖玖玖| 手机看片日日做夜夜| 99热成人| 麻豆AV一区二区三区| 亚洲熟女乱色综合亚洲网站| oumeisesewang| 婷婷五月天国产在线播放| 久99热| 成人在线视频一区| 色。 日日日| 99热碰碰| www.婷婷com| 成人AV在线电影| 丁香婷婷成人网| 激情99| 国产av基地| 亚洲精品五月| 五月天色综合| 色五月欧美| 丁香五月天激情综合网| 99热大香蕉| 丁香五月伊人| 《战争与艾拉》完整版| 玖玖午夜视频| 超碰人人摸AV| 激情涩涩网| 久综合| 午夜激情四射影院| 26uuu淫色| 超碰大香蕉网| 婷婷激情四射五月天| 襙逼网| 5月丁香啪啪啪| 精品久久婷婷| 狠狠插日日干撸| 中国女人做爰A片| 久久九色| 热99免费在线| 99精品手机在线视频| 五月综合777| 色综合色色色| 五月天婷婷操逼视频| 最新丁香六月婷婷| 色狠狠色噜噜AV天堂五区| 99爱视频精品| 九九99九九99九九99视频网| 超级碰人人操人人干| 婷婷五月久久| 国产精品99久久久久久久女警 | 欧日韩AV| 婷婷色色五月| 色色丁香婷婷综合| 国产午夜精品一区二区| 色五月开心久久网| 337午夜福利| 黄急一级视频| 成人色情五月天婷婷丁香| 天天操婷婷| 久热大香蕉| 九月激情网| 久99视频在线观看| 九热视频在线精品15| 婷婷五月激情五月丁香五月| 激情性五月天免费小说视频| 五月丁香婷婷综合在线| 婷婷五月天av| 久热 91| 高清国产AV| 九九热思思| 日噜噜色| 狠狠色综合久久| 任你弄在线视频免费| 97好吊操| 久久5 9视频免费观看| 秋霞影音91人妻久久| av免费在线看不卡无毒| 九九一综合精品| 韩日另类| 五月天激情婷婷丁香| 五月天丁香婷婷久久九| 天天干天天干天天干天天干天天| 国产成人精品一区二三区熟女在线| 丁香五月婷婷呀| 熟妇人妻中文字幕无码老熟妇| 天天爽天天弄| 成人精品视频99在线观看免费| 五月综亚洲| 综合aV在线| 人妻久久久久久久久久| 五月婷婷 自拍| 婷婷成人视频| 激情综合99| 99热免| 2050人人操免费工开爱| 风流少妇A片一区二区蜜桃| 婷婷激情六月中文| www.久99| 美女天天爽| 久久婷婷五月综合激情国产| 婷婷久久网| 亚洲激情无码久久| 操操操97| 五月婷婷福利| 人妻中文字幕网| 色五月天堂| 99久热这里有精品| www.丁香六月婷婷久久天堂影院.con| 丁香六月婷婷综合在线| 五月天激情综合网| 久久停停超碰| 99热20| 婷婷在线日韩综合| 婷婷五月天开心网| 一级精品999WWW| 伊人五月天| 日本成人小说婷婷六月| 婷婷久久图片| 任你爽视频| 丁香5月综合啪啪| 操婷婷久久| 中文字幕av久久爽一区| 五月激情综合婷婷| 91主播在线| 亚洲第一黄网| 人色五月天婷婷| 综合精品啪啪| www色婷婷| 婷婷五月天视频小说| 色五月97| www激情| 这里只有精品网| 99在线视频色版| 国产69精品久久久久999小说| 99热6精品| 六月婷婷成人| 高清免费在线视频| 九九色婷婷| 思思re视频在线| 亚洲无码成人| 青青久在线视频免费观看| 狠狠综合网| VA国产在线综合网站| 另类丁香综合| 日本三级日本三级99| 99色色色色| 天天色天天色天天色天天色天天色天天色| 青青久久五月天丁香婷婷|