免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
AV天堂婷婷五月天| www,26uuu,c0m,色情| 97五月天| 91人人网| 九九精品网| www色婷婷久久综合久色| 国产44页| 婷婷六月香| 国产在线黄色| 丁香六月婷| 开心五月婷婷六月丁香| site:xmssd.com| 9l视频自拍九色9l黑人| 久久久av久av久片一区二区| 日本猛少妇色XXXXX猛叫| 五月婷婷av| 九九99视频精品| 久久精品99久久久久久| 另类激情四射| 99色五月| 欧美在线看| 日本天堂网站99| 综合网激情| 五月丁香婷婷网在线在线| 伊人丁香五月| 精品无码色| 色碰碰视频| 久久香视频| 强壮公让我夜夜高潮A片视频| 五月丁香六月婷综合成人综合 | 77799热| 熟女国产在线一区二区三区四区| 久9热在线免费观看| 亚洲午夜AV| 七七九色| 乱码操操| 日本一级一级一级一级| 牛色色碰| 91九九九九九九| 成人免费120分钟啪啪| 免费视频99| 无码啪啪| 久久精彩免费视频| 色日本五月天| 99欧美| 久久98| 狠狠操狠狠| 久久精品视频9| 五月天色婷婷av| 婷婷久久五月| 婷婷欧美激情综合| 午夜九九电影| 六月丁香激情综合| 婷婷六月天激情| 99国产小视频| 日本色婷婷| 思思国产99| 丁香五月综合高清在线| 九九国产精视频| 久久精品婷婷五月丁香| 婷婷五月天丁香| 天天射美女| 久久精品9| 91久久综合亚洲噜噜成人在线| 色射7856五月天激情四射| 色五月综合激情网| www. 五月. com| 日本丁香五月| 国产成人精品一区二三区熟女在线| 青青草成人网| 97色精品视频| 亚欧州精品视频| WWW·色色色·COM| 他改变了拜占庭| aⅤ79成人片| www.狠狠| 日日操天天爽| 色婷网| 综合久久婷婷| 熟女少妇内射日韩亚洲| 月色色综合婷婷网| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 日日操夜夜操狠狠操| 久久九九视频网站| 婷婷色Av| 99操久久| 色色色九九九五月婷婷| 五月丁香婷婷综合久久| 天天色综合色| 五月丁香综合影院| 国产亚洲精品AAAAAAA片| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 99热九九在线| 久久五月丁香六月婷| 综合啪啪| 国产 A片 自拍| 天天色综合色| 99色中文| 香港九九六区八区99| 五月婷婷狠狠久久| 玖月婷婷爱丁香| 99伊人婷婷在线| 亚洲精品国产熟女久久久| 无码免费人妻A片AAA毛片西瓜| 国产精品扒开腿做爽爽爽A片唱戏| 超pen个人视频97| 五月婷婷综合天天操| 99热只有精品在线观看| 九九在线精点品| 婷婷色网站| 狠狠色综合网| 久久伦乱| 99热在线观看免费精品| 激情综合婷婷| 三级毛片7979| 五月天久久www| 亚洲无码99| 日韩aaa| 碰超亚洲| 五月天婷婷网站| 五月人妻婷婷视频| 熟妇国产| 亚洲色vA| 精品一区二区三区四区五区六区| 五月丁香六月婷婷成人| 久久色情综合免费网站| 无码字幕中文| 99热日| 久久草中文日韩欧美| 狠狠CAO日日穞夜夜穞AV| 激情五月综合久久| 精品怡红九九九| 超碰超碰在线| 久久精品99久久| 人人操A| 五月天婷婷色| 九九综合网色全集| 色综合色| 久久婷网| 91久久综合亚洲鲁鲁五月天| 六月丁香五月婷婷| 日本激情综合| 激情五月丁香激情综合网| 日本三级日本三级99| 激情五月婷色| 婷婷五月免费视频| 九月久久婷婷| 五月激情影院| 九九99热| 亚洲成人AV在线观看| 婷婷五月丁香色色| 天天五月天综合网址| 可以看的av| 99熟女啪啪视频| 丁香六月婷婷综合在线| 人人操大| 激情五月丁香在线观看直播| 中文字幕在线免费观看视频| 人妻性爱av网站| 婷婷五月天丁香社区| 色播五月网| 99五丁香月| 日本激情五月天‘| www,色综合| 婷婷五点亚洲| 婷婷九月在线| 色播五月丁香| 六月丁香啪啪| 成人无码精品1区2区3区免费看| 婷婷五月激情的图片| 五月丁香色色网| 日本久久婷| 婷婷射丁香| 久久久久久综合88| 99精品国产在热久久| 五月天色播网| 99精品丰满| 天天日,天天射,天天舔| 婷婷内射视频在线| 欧美激情综合| 国产精品热搜丁香五月婷婷| 国产免费一区二区三区三州老师F1F1.CC | 婷婷五月天色| www.婷婷,com| 91xxxx九色| 天天做天天爽| 久久er免费视频| 久久性爱视频| 五月丁香六月婷婷无码| 99热91| 天天日天天色| 六月激情婷婷| 亚洲精品五十一区| 韩国三级五月天婷婷。| 超碰人人在线| 国产干逼片| 五月天婷婷在线AN| 婷婷丁香五月天婷婷| 久热9| www.操逼comm| 久久激情五月| 亚洲中文字幕翔田千里| 色色五月丁香| 婷婷成人丁香色情基地30 | 欧美狠狠地| 99热传媒| 九九热只有精品| VA国产在线综合网站| 日韩精品在线观看9| 五月婷婷婷丁香播| 九九草热在线观看| 五月婷婷激情性爱| 激情婷婷99| 婷婷97碰碰| 婷婷丁香视频在线观看免费 | 色婷婷五月天偷拍| 5月色亭亭视频| 亚洲欧美日韩另类| 嫩草AV久久伊人妇女超级A| 天天做天天要天天爽| 免费无码毛片一区二区A片| 另类国产综合| 亚洲 综合中文| 99情色五月天| 色色色.com| 九九九九九九九九九九九九九国产精品| 91精品国产99久久久久久天美| AV天堂淫乩| 婷婷五月天大香蕉| 欧美,日韩成人在线| 俺去也综合| 婷婷五月天激情综合婷婷五月天激情综合 | 婷婷激情综合色五月久久91| av免费在线看不卡无毒| 深爱综合网| 99热这| 五月天a婷婷伊人| 五月丁香激| 激情婷婷丁香五月| 精品色色| 婷婷在线播放| AA片在线观看视频在线播放| 五月婷婷久久综合| 色情五月婷婷| 99九九热视频| 色五月五月天色婷婷色五月| 五月天婷婷影院影院观看| 天天激情综合| 激情五月深爱五月| 综合激情啪啪| 99人这里只有精品| 成人片久久网站| 丁香大香蕉| 色婷婷成人色网| 色色色色色网| 丁香九月婷婷| 99久久6| 亚洲欧洲午夜成人精品av| 六月色丁香婷婷| 成人丁香五月| 色情五月综合婷婷| 99热在这里只有精品| 五月婷婷导航| 婷婷五月天奸女| 综合一区二区三区| 日本久久精品| 狠狠综合网| 六月婷婷五月丁香| 亚洲妇女熟BBW| 天天综合色| 日本欧美国产| 日韩aaa| 欧洲亚洲免费视频9| 激情图片久久| 天天干 夜夜爽| 色五月激情网| 亚洲中文字幕在线观看| 五月丁香综合精品欧美| A片试看120分钟做受图片| 色播五月婷婷| www.第四色99| 亚洲成人网站在线| 天天做天天爱天天搞| a网站免费观看| 婷婷五月四狠狠| 婷婷月五天在线在线看| 深爱五月天 开心网| 丁香久久五月天视频在线观看| 中文字幕在线日亚洲9| www.com色播五月天| 久热亚洲| 另类五月婷婷| 夜夜躁爽日| 久久婷婷91| 久久国产色| 精品一二三区久久AAA片| 国产看真人毛片爱做A片| 狠狠精品干练久久久无码中文字幕| 婷婷丁香综合网| 九九99视频| 99热免费看| 综合五月天完整| 色五月天成人| 色婷婷影视| 婷婷丁香六月天| 色五月97| 丁香六月天婷婷色| 免费黄色视频网址| 1769在线观看欧美国产| 久久97| 五月天色在线| 99爱视频在线| 97色视频网| 99热9999| 欧美性色五月天| 9热在线观看| 五月丁香久久| 五月丁香网站| 开心五月婷婷99| 99精品网| 中文字幕人妻一区二区| 六月五月丁香五月欧美| 丁香五月婷婷偷拍| 欧美日本日韩| 性一交一乱一交A片久久四色| 五月天欧美 另类小说| 岛国AV网| 伊人婷婷99热精品| 五月天五月色婷婷综合| 9久热免费视频99| 色色色五月天婷婷| 26uuu色噜噜精品一区| 色色色色网站| 午夜成人av在线| 色婷婷五月天激情| 97干在线观看视频| 久久久免费图片视频| 五月噜噜噜色综合| 能看的av网站| 91成人看| 婷婷色五月色| 六月婷欧美丁香综合| 狠狠操狠狠爱| 99国产这里只有精品| 五月天婷婷成人网| 狠狠操狠狠爱| 五月天色色网站| 日本全黄一级999| 色五月成人网| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 国产高清av黄色看片| 色综合com| 就爱日五月天| 五月天婷婷黄色| 一起草AV| 五月丁香色婷婷伊人| 久久香蕉丁香| 久久丝袜婷婷| 99超级碰碰| 91丨九色熟女丨首页| 怡红院院在线导航网| 五月丁香啪啪啪| 淫视馆AV在线| 99视频内射三四| 九九色院| 狠狠色噜噜狠狠狠狠综合| 熟妇高潮一区av| 99re热久久| 亚洲激情综合| 丰满人妻一区三区三区| 久久免费高| 天天狠狠色| 丁香六月婷婷基地| 99操逼| 丁香五月停停av| 99久久精品网| 婷婷丁香色性爱| 九九爱激情| 九色综合五月天婷五月| 噜噜国产| 狠狠久久婷五月| 九九re精品视频在线观看 | 国产亚洲精品人人| 激情小说婷婷| 欧美综合婷婷网| 亚洲国产精品VA在线看黑人| 欧美日韩AAAA| 97资源欧美日韩大香蕉超碰一区| 91狠狠综合久久| 色婷婷九月| 噜噜五月天综合| 99色视| 少妇人妻偷人精品无码视频新浪 | 狠狠色噜噜狠狠色噜噜噜999| www.日日夜夜.com| wwccc久久久| 欧美五月停| 婷婷丁香五月亚洲| AV在线资源| 人人97碰| 久久综合这里只有精品1 | 噜综合| 专区无日本视频高清8| 亚洲狠狠狠| 色婷婷激情| 天天色视频| 狠狠色综合网| aaaa久久| 久久伊人五月天| www..com色爱| 超碰99资源站| 亚洲宗合激情| 秋霞性爱AV| 综合逼五月激情婷婷| 大香蕉视频婷| 狼人久草| 久久精品系列| 九九热在线视频,| 色综合久久8| 天天爱综合网| 色狠狠五月天| 99热观看| 任你躁XXXXX麻豆精品| 六月激情久久| 色色色欧美色色| 99视频网址| 五月丁香成人网| 色深爱五月| 丁香蜜臀黄色婷婷五月天| 西西4r午夜剧场| 色婷婷综合网站| 婷婷五月天免费| 91热在线| 亚州操逼网| 99久久国产宗和精品1上映| 久久这里只有精品热在99| 国产婷伊人| 九九热手机在线视频| 91avse| 五月九九综合| 99燥99日| 少妇做爰免费视看片| 无码动漫av| 五月丁激情| 99久久综合网| Av九九| 97久操| 亚洲狠狠爱婷婷| 综合五月天| 五月婷在线视频免费播放| 国产婷婷色五月| www.久久久久久| a性生活久久无| 日韩999| 婷婷94s| 最新高清无码专区| 少妇AB又爽又紧无码网站| 色噜噜狠狠色综合成人99| 无码 色| 激情亚洲色图片丁香综合| 五月婷婷AV| 久久久久99精品成人网站| 欧美日韩国产一二区| 色色色综合网| 99热在线观看| 曰韩少妇内射免费播放| 乱精品一区字幕二区| 99这里只有精品视频| 五月婷婷我| 亚洲九九九九| 欧美97p| 青青操丝袜美腿| 超碰在线观看9| 国产激情综合五月久久| www.99热这里精品| 99爱在线视频观看| 一区二区中文字幕| 精品网站:999WWW| 七七色色综合| 99热新网址| 91人操| 色婷婷丁香AV综合| 久久九九99桃花视频| 少妇人妻人伦A片| 无码日本精品XXXXXXXXX | 天天操天天插| 亚洲狠狠色丁香婷婷综合久久| 九九综合九| 在线看AV| 97香蕉久久超级碰碰高清版| 啪啪91| 思思热99er在线视频| 色婷婷六月激情| 深爱开心五月天| 丁香五月综合在线播放| 婷婷国产成人| 婷婷五月综合在线| 亚洲AV无码成人电影| 国产精品黑丝| 九九色婷婷| 久久这里都是精品免费| www.色五月| 国产麻豆视频| 成人免费高清在线播放| 人人色婷婷五月天| 26uuu青青| 丁香婷婷六月激情| 狠狠高潮精品亚洲1| 五月狠狠| 天天射影院| 丁香花五月天社区| 伊人91| 五月婷婷深爱六月| 99精品在线观看视频| 深爱激情综合网| 日日夜夜狠狠| 91丨熟女丨首页| 欧美精品在线观看| 国产肏屄大片| 五月婷婷影视| 久久婷婷色色| 久久无码成人| 99WWW免费视频| 久一这里有精品国产| 中文国产五月天| 婷婷五月天激情在线| 激情四射五月天| 99综合97| 色八月婷婷| 老司机日日夜夜青草| www夜夜操| 丁香九色不卡aaa| 久久免费精品小视频| 九九综合久久| 久久婷婷视频| 综合久久婷婷| 天天插天天爱| 婷婷色影音天| 永久99免费视频网站| 五月天亚洲色| 99热每日| 婷婷五月天Av| www.婷婷.com| 久草a片| www.人人操人人看人人想人人摸 人人人人操,COM| 99热这里只有精品首页| 久久综合久色欧美综合狠狠| 久久在线92| 激情综合色| 99免费在线视频| 欧美成人日韩| 久久免费婷婷视频| 天天天天操| 久热99热| 色婷狠狠| www久久久久久久| 激情视频网址| 综激情网| 九月婷婷激情| 日日操,天天操| www.狠狠| 日本美女天天日天天爽| 成人精品在线| 99热只有精品在线播放| 色色99| 婷婷中文字暮| 亚洲天天| 依人大香蕉在钱1| aaaaaa片| 风流少妇A片一区二区蜜桃| 丁香五月激情六月欧亚激情综合导航| 日本色99| 人妻人人操| 五月丁香六月情| 色伦专区97中文字幕| 综合欧美五月婷婷| 婷婷综合视频| 色五月久久成人婷婷| 夜夜躁爽日日| 丁香六月 婷婷六月| 久久99网| 五月天激情在线视频| 丁香婷婷激情| 激情纯色婷婷五月天在线不卡视频| 色色无码| 日本va欧美va精品发布视频| 大地9中文在线观看免费高清| 五月综合激情久久| 99国产精品久久久久久久久久久 | 婷婷五月花| 97色婷婷| 丁香五月天天日| 亚洲欧美在线观看| 狠狠干五月丁香综合网| 亚洲AV无码一区二| 99在线精品观看99| 婷激情五月天视频导航| 超碰在线caop| 综合一本道| 99精品女人天堂| 天堂爱啪啪| 色色五月婷婷久久| 久久五月婷婷电影| 午夜天堂一区人妻| 深爱五月天 开心网| 日韩AC在线免费观看| 欧洲亚洲精品| 九九無碼| 成人久碰| 大香蕉520| 丁香五月婷婷动漫视频| 五月色亭丁香| 久婷婷| 天天爽天天弄| 久久综合五月| 五月婷婷大香蕉| 99色免费视频| 久热久| 色一色综合| 激情爱爱网站超大免费| 五月丁香婷色| 伊人久久综合| 专区无日本视频高清8| 79色色色色| 高清不卡一区| 亚洲xx在线| 五月婷六月| 六月婷婷天天操夜夜爽视频| 久久99草五月婷婷| 色婷婷亚洲精品天天综| 五月婷婷免费看| 激情婷婷五月天| 97人碰人操| 婷婷九月亚洲| 这里只有精品视频在线看| 人妻激情在线| 亚洲综合色婷婷文学| 操九色| 思思久久思思| 中文字幕成人| 五月天丁香综合在线| 丁香婷婷大香蕉| 激情五月天视频| 青草视频在线蜜臀| 丁香六月激情综合| 71在线精品视频一区| 99国产精品久久久久久久久久久| 欧美久久网| www.粉嫩av.com| 亚洲免费在线观看岛国| 亚洲熟妇AV乱码在线观看| 丁香九月综合激情| 综合久久人妻| 五月丁香在线视频观看| a在线免费v| 欧美A级成人婬片免费看理论| 黄网在线免费观看| 婷婷丁香五月综合| 九九人妻福利| 色人久久| 91无码视频| 综合久久综合综合| 久久视9精| 综合激情五月天| 99热日韩| 久久激情五月天| 婷婷开心激情| 五月天五月天激情网| 97碰碰叉| 少妇被下春药玩弄A片| 亚洲六月色| 99久久www| 色婷婷综合影院| 天天综合中文| 六月丁香VA| 9这里只有精品| 深爱激情网婷婷| 亚洲综合激| ss五月天激情| 亚洲精品五十一区| 国产精品五月丁香| 婷婷伊人激情婷婷| 婷婷五月俺要去| 丁香五月天信号| 色10月婷婷视频| 五月丁香六月久久| 欧美五月丁香啪啪响视频| 五月丁香激情啪啪| 密黄站| 久久狠狠干| 大香蕉久| 精品色情一区二区三区四区| 色九网| 婷婷,五月天,丁香,第一| 9er热在线精品视频| 五月综合激情久久| 欧洲亚洲欧洲99久久| 天天情色五月天| 久久思思精品| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 六月丁香婷婷拍拍| mmm1717.6dbm人人爱人人操| 97成人丁香婷婷| 婷婷五月天色网久| 色色综合色| 99久久久久久www| 99热婷婷| 九九视频在线观看视频6| 激情六月婷婷啪啪| 五月婷婷日| www.91AV.COM| 久操人妻| 无码激情精品色婷婷久久久久| 五月婷婷激情综合拍| 色色a| 丁香五月天色婷婷| 婷婷香蕉精品| 国产综合81p| 欧美色五月| 五月丁香婷婷人体| 91视频综合网| 色爱综合网| 在线sebiav精品视频| www久久久久久久97| 五月天婷婷色紫薇阁| 深爱五月婷| 久久久91| 在线中文AV| 伊人在线大香蕉网| 五月色婷婷亚洲 | 久婷婷五月激情| 五月婷婷激情久久| 五月天啪啪| 5月丁香六月情| 久久最新色| 丁香五月电影| 中文字幕丰满乱孑伦无码专区| 97人妻碰碰碰久久香蕉| 色婷婷五月天天天做| 色婷久久| www.五月天婷婷| 五月丁香综合久久夜夜| 九玖视频这里只有精品| 天堂草在线观看| 五月色丁香| 热99久| 婷婷偷拍网| 亚洲成人婷婷| 蜜臀AV在线观看| 九艹在线| 五月天影院| 嫩草AV久久伊人妇女超级A| 涩涩婷婷五月| 天天干、天天日日| 五月天社区| 五月丁香激| 丁香五月,激情五月,深爱五月| 国产成人99久久亚洲综合精品| 在线观看欧美3区| 丁香五月激情欧欧美| 日韩久热| 岛国操B不卡在线| 呦呦AV| 日本欧美成人片AAAA| 99a级片| se99在线| 丁香六月啪啪| 欧美色五月| 午夜成人综合| 四色五月视频| 牛牛碰免费| 天天综合网91| 五月丁香色婷婷色| 99这里| 七七色综合| 色婷婷六月精品| 99视频自拍| 91chinese在线| 超级碰碰碰97免费| 四季AV综合网| 丁香激情六月天婷婷| AV九九| 五月婷俺去也| 色综合伊人网| 五月总合激情网| 91九色精品熟女内射| 五月天久久网站| 天天日 天天草| JlZZJlZZ8JlZZ亚洲熟女| 爱草视频在线观看| 精品成人无码A片观看香草视频| 久久中文人妻系列| 99热这里有精力| 91n啪啪| 人人干人人操人人摸| 麻豆五月丁香婷婷| 狠狠色婷婷综合开心影视| 综合五月激情网| www.色欲丁香婷婷| 色在线视频网2025| 九九人人看| 日韩啪啪视频| 亚洲综合视频天天精品| 99色| 五月丁香黄色| 丁香花五月天社区| 五月婷婷人妻| 综合www色| 综合激情在线视频| 色九九七七| 色色色色色色综合| 亚洲宗合激情| 五月婷婷激情综合网 | 久九色| 五月天国产成人| 婷婷五月天激情网| 精品久久久久久久人妻| 五月丁香人妻| 五月丁香操婷逼| 婷婷欧美色| 亚洲黄色网址| 欧美色婷婷| 一起肏在线视频| 色色五月丁香| 丁香六月五月婷婷| 五月天丁香成人社| 婷婷五月综合激情| 99热这里只有精品在线播放| 久久久久激情网| 日日夜夜狠狠| 这里只有精品在线看| 亚洲无aV在线中文字幕 | 99热精品在线在线| 噜噜色五月| 能看的av| 色色色com| 99色色热| 97超碰色| 婷婷99狠狠| 99热这里只有精品最新| 五月丁香亭亭操逼| 五月天电影网| 久久99综合网| 夜夜爽日日躁| 中文字幕,综合,91| 女人高潮内射99精品| 热99视频| 欧美va视频| 蜜臀久久99精品久久久久久酒店| 五月天.com| 丁香激惜男女| 大香婷婷| 久久综合九色综合97婷婷| 九九在线精品| 桔色成人官方网站| 色狠狠色综合久久久绯色AⅤ影视| 五月丁香综合网| 五月婷婷综合丁香视频| 欧洲亚洲最新精品| 久在线综合69| 激情五月综合网| 这里只有精品无码| 日日爽日日操| 丁香五月综合婷婷| 色综啪啪啪啪啪啪| 免费看欧美成人A片无码| 91狠狠色丁香| 无码人妻一区二区三区免费九色| 丁香婷婷六月激情文学| 欧美激情久| 色五月婷婷在线观看第一页舔| 丁香五月天啪啪| 四色五月婷婷| 99热6色| 夜夜夜夜操| 精品久色| 色婷婷亚洲| 激情五月成年| 五月婷婷综合激情| www.久热| 色色色色色色色色色色色色色色,网站| 五月婷婷新网站| 婷婷综合色| 天天操精品| 3p九色在线| 少妇性BBB搡BBB爽爽爽视頻| 99视频网址| 色色色色色色网站| 99小视频网站| 激情综合五月色丁香婷婷| 丁香香五月激情免费视频| www.五月婷婷| 婷婷丁香色情| 日本久久色| 激情5月婷婷| 超碰人妻公开在线| 一级AV片| 五月天婷久久| 91干婷婷| 色婷婷香蕉| 日韩婷婷| 天天综合精品| 丁香五月婷婷基地| 97色干| 婷婷五月天av| 99色色网| 97精品人人A片免费看| 中文字幕 码精品视频网站| 99久在线精品99re8热| 99色在线视频| 99热久| 99久久婷婷国产综合精品草原| 中文字幕无码AV| 少妇搡BBBB搡BBB搡毛茸茸| 国产伦亲子伦亲子视频观看| 丁香五月色| 亚洲妇女熟BBW| www九九热| 五月开心网| 五月婷av| JAPANRCEP老熟妇乱子伦视频| 国产精品国产成人国产三级| 无码任你操| 99热91| 亚洲第一成人无码A片| 欧美A级成人婬片免费看理论| 久久婷婷五月天大香蕉| 国产无遮挡又黄又爽免费网站| 激情操逼婷婷| 人人操人| 五月婷啪啪| 婷婷五月色播网| 91无码高清| anquye伊人| 五月丁香欧美在线| 五月婷婷丁香网| 欧美日比视频| 五月天桃色深爱网| 免费无码毛片一区二区A片| 成人五月天综合网| 婷婷va| 99re66热这里只有精品| 中文无码精品一区二区三区| 人人爱人人摸人人澡| 丁香色啪综合| 色七七色九九| 天天综合在线网| 99国产精品久久久久久久久久久| 99久久人人| 色色五月天网站| 乱女乱妇熟女熟妇综合网站| 亚洲久艹| 五月丁香猫咪久久婷婷综合视频激情四射网入口| 开心丁五月| 五月第四色| 久久久婷婷婷| 激情网五月天| 国产婷伊人| 婷婷月综合| 五月天婷婷色播在线网| 欧美成人va| 五月激情小说| 婷婷无五月无码视频| 九月婷婷激情| 极品 少妇 内射| 丁香激情六月天婷婷| 九月av| 免看黄大片AA | 国产97色在线 | 日韩| 插插插色综合网| 色五月涩涩婷婷| 中文字幕人成乱码在线观看| 亚洲色夜| 99久久综合精品五月天| 91一起操| 99re在线视频| AAA亚洲AV| 激情五月天影院| 玖玖婷婷视频| 国产精品色色色色| 这里只有精品2| 免费播放AV| 就爱啪啪婷婷| 午夜丁香婷婷| 国产1区2区| 久久婷婷欧美| 来吧亚洲综合网| 色综合偷拍| 五月天色裸体视频| 狠狠色综合网| 久久人五月| 综合伊人狠狠| 日韩免费视频| 久久激情视频99| 99这里是精品| 欧美交换配乱吟粗大25P| 超碰超碰在线| 人人色婷婷| 99热每日| 森林影视大全,最好看的2019年视频 | 999热成人在线综合网| 亚洲AV免费在线| 美女精品一级不卡视频| 九九99久久| 五月丁香亚州综合网| 日韩av干| 极品人妻VIDEOSSS人妻| 99综合| 色色色色综合网| 色情五月天。| 久久怡红院| 久久久久久久久久婷婷| 丁香五月婷在线| 欧美性生交XXXXX无码小说 | 99热99极品观看| 日本97久久久精品| 九九精品亚洲| 久久玖玖综合| 伊人婷婷五月天| 老师把我爽高潮了免费A片| 美女婷婷六月色| 99无码视频| peg 2区三区四区的| 天天玩夜夜操| 亭亭丁香aV| 人妻少妇色综合| 五月天婷婷黄色视频| 色播五月丁香| 丁香五月花婷婷开心| 丁香婷婷基地| 丁香六月婷婷缴情欧美| 婷婷爱五月| 激情深愛五月視頻| 超碰v| 激情综合网激情五月欧美| 欧美日韩二区在线| 五月亭亭六月天| 亚洲婷婷激情综合激情999精品| 六月份天丁香婷婷| 99热丁香| 超碰狠狠操| 色色免费网站| 97色干| 5月丁香六月情| 丁香婷婷激情四射五月| 婷婷网五月天| 久久99精品久久久久久噜噜| 婷婷五月天成人网| 无码网| 激情综合网激情五月婷婷| 久久久人妻人伦| 无码日本精品XXXXXXXXX| 九九热这里只有精品一| 99热欲| 性爱网五月天| 操九色| 丁香激情五月| 亚州AV超碰人人操| 99超碰人人| 无码任你操| 99热这里有精品24| 99久久国产综合精品五月天喷水\| 亚洲va在线∨a天堂va欧美va| 97精品自拍视频| 99色在线视频| 亚洲精品午夜国产va久久成人| 99日精品视频| 久久性爱视频| www.思思99热| www一起操在线观看| 婷婷五月天激情文学| 九九热手机在线视频| 草榴视频网| 另类在线| 人妻久久久| 欧美色图天堂网| 欧美噜噜久久久XXX| 99九九在线| 久久网站免费亚洲| 精品少妇人妻AV无码专区偷人| 婷婷伊人五月天| 99久久精彩视频。| 亚洲精品无码99热| 日日操夜夜擼| 91精品久久久久久77777| 国产乱子轮XXX农村| 操人妻AV| 97超级碰碰碰久久久| 六月婷婷色综合| 日本猛少妇色XXXXX猛叫| 五月婷婷爽爽爽| 99热人人操人人操| www.seqingwuyuetian| 99re久热| www.99精品视频| 久久九区| 99 频99热国里只有精品| 夜夜操天天爽| 亚洲第一综合| 五月天丁香网| 日日干天天爽| 天天射影院| 国产精品电| 在线99精品| 婷婷激情五月综合| 99久久66| 亚洲行行色色| 五月天激情网图片| 天天色天天日| 伊久大香蕉| 丁香五月天社区婷婷| 五月婷精品| 五月丁香亚洲五月| 99这里只有精品在线观看| av在线免费网站 | 久久久日韩特色特黄AAAA| 婷婷国产欧美97| 综合另类视频| 五月激情婷婷图片基地| 色综合综合网| 婷婷九月综合| 精国产品一区二区三区A片| 嫩草免费视频| 成人欧美日韩| 久久欧洲久久| 欧美亚洲婷婷五月| 亚洲丁香网| 色停停香蕉视频| 国产一二区爆乳_1国产日韩一区二区三-成人AV| 99日本视频在线观看专区| 国产精品成av人在线视午夜片| 91精品婷婷国产综合| 五月丁香六月欧美综合| 亚洲欧美一区二区三区四区爱爱动图| 九九AV在线| 日本色五月| 激情婷婷丁香| 综合久久久| 激情五月丁香激情综合网| av人人操| 超碰在线观看9| 操人妻AV| 九色视频91疯狂| 日本五月视频| 久久精品这里只有精品免费首页| 乱精品一区字幕二区| 丁香六月婷婷综合欧美| 嫩草AV久久伊人妇女超级A| 99免费热视频在线| 北京熟妇搡BBBB搡BBBB| 九九青草热| 亚洲女婷婷五月基地综合久久久| 色噜噜狠狠色综合网| 玖玖99婷婷| 99这里有精品久久97| 欧美五月婷婷| www九九热| 91九色在线视频| 丁香六月视频免费观看| 99热这里只有精品99| 色噜婷婷| 五月激情另类| 丁香婷婷色五月| 91九色PORNY肉丝在线| 丁香五月天色综合| 性色婷婷| 狠狠色丁香久久综合婷婷亚洲成人福利| 九九视频网| 成人电影在线免费试看| 欧美叉叉叉BBB网站| 日本三级大片| 色色色五月婷| 欧美大片免费播放器| www.久久久久| 九九热免费视频| 高清无码网址| 在线观看的av| 五月丁香色综合| 日本97在线观看| 丁香婷停五月激情综合深爱| www色五月| 人人妻人人澡| 天天五月情| 五月婷婷开心网| 99热爱爱干干日| 蜘蛛女侠2003满天星免费观看| 五月丁香 狠狠爱| 操日本人妻视频| 人妻久久久| 久久99激情| 日本三级日本三级99| 亚洲XX网| 牛牛碰免费| 日韩在线观看网址| 香蕉久久国产AV一区二区 | 亚洲欧美成人在线| 久久久大香蕉| 日本人妻丁香婷婷久久寝取熟女五月| 亚洲精品大片| 婷婷天堂站| 五月天激情网图片| 丁香色五月AV在线| 婷婷成人五月天成人文学小说| 一区二区成人电影免费播放| 激情婷婷综合| 婷婷丁香五月综合| 久久这里只有精品07| 久热91| www.粉嫩av.com| 色欲影香| 男女99免费视频| 91丨九色丨国产打屁股| 另类激情综合| 激情综合五| 免费日韩99| 乱精品一区字幕二区| VA色婷婷| 国产精品大香蕉| 97超碰人人操| 久99久视频| 九色七七| 五月丁香啪啪啪啪| 99久久极情精品一区| 欧美丁香婷婷天天操| 欧美S码亚洲码精品M码| 亚洲色9| 亚洲精品V天堂中文字幕| 另类婷婷丁香| 五月Huangsewang| 我要看激情五月天| 丁香五月花| www.开心激情| 婷婷中文网站| 丁香六月天堂| 一起肏在线视频| 天天久久狠狠色综合| 丁香六月婷月91婷月| 香蕉久久国产AV一区二区 | 在线成人国产| 婷婷五月天视频免费在线观看| 天天操天天国产三级片处女学生妹| 俺去也综合| 97操视频| 久久婷婷伊人| 这里只有精品免费观看网占| www五月天com| 五月婷婷色播| 久久只有这里精品免费| 免费看成人AA片无码视频吃奶| 丁香婷婷色六月| 人人操超碰| 婷婷六月五月| 六月丁香综合| 亚洲五月婷| 色 五月婷婷基地| 亚洲综合成人网站| 亚洲成人噜噜| 啪啪综合| 超碰v| 狠色狠色综合久久| 青青草原亚洲天堂| 一点色成人网| 99re热免费观看视频精品| AV中文在线| 91久女| 激情小说五月天|