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

ARTICLE DETAIL

資訊詳情

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

Qt PDF預(yù)覽:用QPrintPreviewWidget實(shí)現(xiàn)打印預(yù)覽與避坑指南

Qt PDF預(yù)覽:用QPrintPreviewWidget實(shí)現(xiàn)打印預(yù)覽與避坑指南 簡(jiǎn)介面向需要在Qt應(yīng)用中集成PDF預(yù)覽能力的開(kāi)發(fā)者這套示例直接采用QPrintPreviewWidget配合QPrinter、QPainter完成PDF渲染全程未引入任何第三方庫(kù)同時(shí)支持放大、縮小視圖操作簡(jiǎn)單直觀。壓縮包共24個(gè)文件、約3.93MB主要包含2個(gè)cpp源文件、1個(gè)h頭文件、1個(gè)pro工程文件、1個(gè)ui界面定義與1個(gè)qrc資源腳本并附有LICENSE、README說(shuō)明以及15張jpg和1張png效果截圖方便在Qt Creator中打開(kāi)工程直接構(gòu)建并通過(guò)截圖對(duì)照理解界面交互。已有6798人學(xué)習(xí)該資源適合Qt進(jìn)階開(kāi)發(fā)者學(xué)習(xí)打印框架與文檔渲染場(chǎng)景。通過(guò)源碼可深入理解QPrintPreviewWidget與QPainter協(xié)作繪制PDF頁(yè)面的核心流程掌握利用QPrinter設(shè)置輸出頁(yè)面、結(jié)合預(yù)覽控件實(shí)現(xiàn)縮放交互的典型用法也可將其中頁(yè)面繪制、縮放手勢(shì)或工具欄邏輯移植到現(xiàn)有項(xiàng)目快速實(shí)現(xiàn)輕量級(jí)PDF預(yù)覽避免接入重型第三方庫(kù)。1. 想給項(xiàng)目加 PDF 預(yù)覽QPrintPreviewWidget 是繞不開(kāi)的那條路接到一個(gè)內(nèi)部工具的需求給一套報(bào)表程序加上 PDF 預(yù)覽和打印能力。界面不用花哨能翻頁(yè)、能縮放、能直接送打印機(jī)就行。第一反應(yīng)是找個(gè)現(xiàn)成控件翻了一圈發(fā)現(xiàn) Qt 里其實(shí)有一個(gè)專(zhuān)門(mén)干這個(gè)的現(xiàn)成控件就是 QPrintPreviewWidget——標(biāo)題里的 Qt-Pdf預(yù)覽示例-采用QPrintPreviewWidget 說(shuō)的也是它。但這里有個(gè)反直覺(jué)的點(diǎn)直接 new 一個(gè) QPrintPreviewWidget 是顯示不出 PDF 的它預(yù)覽的是打印機(jī)要畫(huà)的內(nèi)容你得把 PDF 頁(yè)面當(dāng)成“打印內(nèi)容”畫(huà)進(jìn)去它才真正工作。這篇文章就圍繞這條主線展開(kāi)原理怎么銜接、最小代碼怎么寫(xiě)、參數(shù)怎么調(diào)、以及那些不跑一遍根本發(fā)現(xiàn)不了的坑。適合正在做桌面工具、想在程序里塞進(jìn)輕量 PDF 預(yù)覽的開(kāi)發(fā)者也適合打印排版邏輯需要統(tǒng)一預(yù)覽和輸出效果的人。2. 為什么是 QPrintPreviewWidget它預(yù)覽的是繪圖結(jié)果不只是 PDF2.1 預(yù)覽控件和打印機(jī)共用同一個(gè)繪制坐標(biāo)系先想清楚一個(gè)本質(zhì)問(wèn)題QPrintPreviewWidget 到底是拿來(lái)預(yù)覽什么的??搭?lèi)名也看得出它是“打印預(yù)覽控件”不是“PDF 預(yù)覽控件”。它的職責(zé)是把一次 QPainter 繪制過(guò)程模擬到屏幕上讓你在點(diǎn)打印之前就看到打印機(jī)會(huì)畫(huà)出來(lái)什么。這套繪制的目標(biāo)對(duì)象是 QPrinter也就是一臺(tái)虛擬打印機(jī)頁(yè)面大小、分辨率、方向都由 QPrinter 的參數(shù)決定。所以 PDF 預(yù)覽這件事的完整鏈路是先有一個(gè) QPdfDocument 負(fù)責(zé)解析 PDF 文件再把 PDF 的每一頁(yè)渲染成一張 QImage最后在 QPrintPreviewWidget 的繪制回調(diào)里用 QPainter 把這張圖片畫(huà)到“虛擬打印機(jī)”上。屏幕顯示和真正打印走的是同一套繪制代碼這就是為什么用 QPrintPreviewWidget 而不是直接用 QLabel 貼圖——你調(diào)的是打印狀態(tài)機(jī)不是單純顯示。這個(gè)設(shè)計(jì)帶來(lái)的第一個(gè)好處是你不需要維護(hù)兩套布局代碼。預(yù)覽時(shí) QPrintPreviewWidget 會(huì)按 QPrinter 的頁(yè)面尺寸模擬分頁(yè)效果打印時(shí) QPrinter 也按同樣的尺寸出紙兩個(gè)環(huán)節(jié)不會(huì)出現(xiàn)“預(yù)覽是對(duì)的打印出來(lái)全亂”的問(wèn)題。第二個(gè)好處是預(yù)覽控件自帶了頁(yè)數(shù)導(dǎo)航、縮放、翻頁(yè)交互省去自己造的輪子。2.2 為什么不用 QPdfView也不用自繪控件很多人第一反應(yīng)是用 QPdfView它是 Qt 里直接對(duì)標(biāo) PDF 瀏覽的控件能滾動(dòng)、能選文字體驗(yàn)也接近閱讀器。但 QPdfView 的設(shè)計(jì)目標(biāo)是“讀文檔”不是“打文檔”。你真要打印時(shí)還是得自己把 PDF 頁(yè)面按 QPrinter 的要求重新排版一遍等于預(yù)覽一套邏輯、打印另一套邏輯。而且 QPdfView 的顯示密度和打印機(jī)分辨率不是一回事預(yù)覽適配得好不代表打出來(lái)清晰。自繪控件這條路也有自己處理滾輪縮放、頁(yè)碼顯示、DPI 換算做出來(lái)確實(shí)很靈活但工作量和邊界情況都多尤其是高分屏和多頁(yè)布局要自己調(diào)的地方非常碎。QPrintPreviewWidget 的定位正好在中間它不負(fù)責(zé)解析 PDF也不負(fù)責(zé)像素級(jí)渲染但它把“打印機(jī)頁(yè)面模擬”這層做得足夠完整PDF 解析交給 QPdfDocument像素渲染交給 Qt 自己的光柵引擎各管一段接縫清楚。Poppler 這條路線也是常見(jiàn)選擇特別是要解析復(fù)雜 PDF 標(biāo)注、表單這類(lèi)高級(jí)特性時(shí)Poppler 的能力比 Qt PDF 模塊更全。但對(duì)大多數(shù)內(nèi)部工具來(lái)說(shuō)Poppler 引入的構(gòu)建依賴(lài)和許可證核驗(yàn)成本都不低QPrintPreviewWidget 配合 Qt PDF 模塊能在幾小時(shí)內(nèi)跑通全流程。選型判斷就一條只要你的 PDF 來(lái)源可控、不需要復(fù)雜交互式表單這條路最省。2.3 paintRequested 回調(diào)里到底發(fā)生了什么QPrintPreviewWidget 的工作方式是向外發(fā)一個(gè) paintRequested 信號(hào)參數(shù)是一個(gè) QPrinter 指針。這個(gè)信號(hào)什么時(shí)候觸發(fā)控件初始化時(shí)、你點(diǎn)翻頁(yè)時(shí)、點(diǎn)縮放時(shí)、調(diào)用 updatePreview() 時(shí)都會(huì)觸發(fā)。你要做的就是連上這個(gè)信號(hào)然后在這個(gè)回調(diào)里把當(dāng)前 PDF 頁(yè)畫(huà)到傳進(jìn)來(lái)的 QPrinter 上。繪制時(shí)的邏輯要點(diǎn)如下先設(shè)置 QPrinter 的頁(yè)面大小和分辨率再?gòu)?QPdfDocument 里取出當(dāng)前頁(yè)的渲染結(jié)果最后用 QPainter 把圖片按頁(yè)面矩形畫(huà)進(jìn)去。QPainter 可以綁定 QPrinter也可以綁定 QPrintPreviewWidget 內(nèi)部的預(yù)覽引擎兩者的繪制代碼完全一致這是這套方案的核心優(yōu)勢(shì)。這里有一個(gè)容易想歪的地方QPrinter 的單位是像素嗎不是。QPrinter 的坐標(biāo)系單位受分辨率影響分辨率就是每英寸點(diǎn)數(shù)你在 300 DPI 下畫(huà) 100 像素物理上就是一英寸的三分之一。QPdfDocument 渲染出的 QImage 有自己的像素尺寸你要做的是把它按比例縮放到 QPrinter 的頁(yè)面矩形里而不是直接 drawImage 原圖。2.4 初始化和信號(hào)連接的骨架代碼先看一個(gè)不含業(yè)務(wù)邏輯的最小連接后面再補(bǔ)充完整示例#include QApplication #include QPrintPreviewWidget #include QPrinter #include QPdfDocument int main(int argc, char *argv[]) { QApplication app(argc, argv); QPrinter printer(QPrinter::HighResolution); printer.setPageSize(QPageSize(QPageSize::A4)); printer.setResolution(300); QPrintPreviewWidget preview(printer); QPdfDocument pdfDoc; // 這里先只連信號(hào)加載和繪制邏輯在完整示例里展開(kāi) QObject::connect(preview, QPrintPreviewWidget::paintRequested, [](QPrinter *p) { // 后續(xù)章節(jié)會(huì)填真正的繪制代碼 }); preview.resize(900, 700); preview.show(); return app.exec(); }這段代碼先把 QPrinter 以高分辨率模式建出來(lái)設(shè)置 A4 紙和 300 DPI。QPrintPreviewWidget 構(gòu)造時(shí)接收 QPrinter 的地址之后回調(diào)里拿到的也是同一個(gè)打印機(jī)對(duì)象參數(shù)改動(dòng)會(huì)直接反映到預(yù)覽布局上。要注意 setResolution 必須在構(gòu)造之后、預(yù)覽刷新之前設(shè)置否則預(yù)覽顯示和實(shí)際打印的分辨率可能不一致后面的坑里會(huì)細(xì)說(shuō)。3. 最小可用示例讓 PDF 在預(yù)覽控件里正常分頁(yè)顯示3.1 需要的模塊與工程配置把方案落進(jìn) CMake 工程時(shí)除了 Qt Widgets還要引入 Qt PDF 模塊。Qt PDF 模塊提供的 QPdfDocument 負(fù)責(zé)解析和渲染QPrintPreviewWidget 則在 Qt PrintSupport 模塊里。常見(jiàn)的工程配置寫(xiě)法如下find_package(Qt6 REQUIRED COMPONENTS Widgets PrintSupport Pdf) add_executable(pdfpreview main.cpp) target_link_libraries(pdfpreview PRIVATE Qt6::Widgets Qt6::PrintSupport Qt6::Pdf )如果用的是 Qt 5Pdf 模塊也存在于對(duì)應(yīng)的組件列表中組件名保持一致。一個(gè)常見(jiàn)的工程配置錯(cuò)誤是只鏈接了 PrintSupport 忘了 Pdf結(jié)果 QPdfDocument 的 include 和符號(hào)都找不到編譯報(bào)錯(cuò)指向不明先查這里往往能定位。3.2 加載 PDF 文件和組裝預(yù)覽窗口設(shè)計(jì)一個(gè)簡(jiǎn)單的窗口結(jié)構(gòu)一個(gè) QPrintPreviewWidget 作為主體一個(gè) QLineEdit 輸文件名一個(gè)按鈕觸發(fā)加載和刷新。PDF 文檔對(duì)象用成員變量持有避免在回調(diào)里重復(fù)打開(kāi)文件。具體代碼如下#include QMainWindow #include QPrintPreviewWidget #include QPushButton #include QLineEdit #include QVBoxLayout #include QPrinter #include QPdfDocument #include QPainter class PdfPreviewWindow : public QMainWindow { public: PdfPreviewWindow() { setWindowTitle(PDF Preview via QPrintPreviewWidget); resize(960, 700); m_printer new QPrinter(QPrinter::HighResolution); m_printer-setPageSize(QPageSize(QPageSize::A4)); m_printer-setResolution(300); m_preview new QPrintPreviewWidget(m_printer, this); m_preview-setZoomFactor(1.0); m_preview-setPreviewMode(QPrintPreviewWidget::SinglePage); auto *input new QLineEdit(this); auto *openBtn new QPushButton(打開(kāi)PDF, this); auto *topLayout new QHBoxLayout(); topLayout-addWidget(input); topLayout-addWidget(openBtn); auto *mainLayout new QVBoxLayout(); mainLayout-addLayout(topLayout); mainLayout-addWidget(m_preview); auto *central new QWidget(this); central-setLayout(mainLayout); setCentralWidget(central); connect(openBtn, QPushButton::clicked, this, [this, input]() { if (m_doc.load(input-text().trimmed()) QPdfError::None) { m_preview-updatePreview(); } }); connect(m_preview, QPrintPreviewWidget::paintRequested, this, PdfPreviewWindow::renderPdfPage); } private: void renderPdfPage(QPrinter *printer) { // 完整繪制邏輯在 3.3 節(jié)展開(kāi) } QPrinter *m_printer nullptr; QPrintPreviewWidget *m_preview nullptr; QPdfDocument m_doc; };窗口里用了簡(jiǎn)單的頂層布局放文件路徑輸入和打開(kāi)按鈕下方放預(yù)覽控件。加載 PDF 用的是 QPdfDocument::load傳入文件路徑如果返回 QPdfError::None 就代表解析成功隨后調(diào)用 updatePreview() 觸發(fā)一次重繪。第 1 次接觸 QPrintPreviewWidget 的人常忘記 updatePreview 這一步結(jié)果控件空在那里沒(méi)有任何反饋這是個(gè)容易忽略的細(xì)節(jié)。參數(shù)說(shuō)明里值得留意的是 setPreviewMode。SinglePage 模式下預(yù)覽控件一次只顯示當(dāng)前一頁(yè)配合下方的翻頁(yè)交互最直觀FacingPages 適合雙面對(duì)開(kāi)排版AllPages 會(huì)把全部頁(yè)面攤開(kāi)顯示類(lèi)似打印排版視圖。對(duì)大多數(shù)文檔預(yù)覽場(chǎng)景SinglePage 是默認(rèn)首選。3.3 在 paintRequested 里繪制 PDF 頁(yè)面的核心邏輯這是整個(gè)示例的核心?;卣{(diào)里要完成三件事計(jì)算當(dāng)前頁(yè)面號(hào)的渲染圖、按頁(yè)面矩形繪制到打印機(jī)坐標(biāo)系、處理翻頁(yè)時(shí)的頁(yè)號(hào)推進(jìn)。完整代碼void PdfPreviewWindow::renderPdfPage(QPrinter *printer) { QPainter painter(printer); painter.setRenderHint(QPainter::Antialiasing, true); // 頁(yè)號(hào)保護(hù)預(yù)覽控件內(nèi)部維護(hù)當(dāng)前頁(yè)這里與它的頁(yè)碼同步 int pageIndex qBound(0, m_preview-currentPage(), m_doc.pageCount() - 1); if (pageIndex 0) { painter.drawText(100, 100, 無(wú)法渲染沒(méi)有有效頁(yè)); return; } // 按物理頁(yè)面尺寸計(jì)算目標(biāo)矩形QPrinter 的邏輯單位是 1/分辨率 英寸 QRectF targetRect(0, 0, printer-width(), printer-height()); // 渲染當(dāng)前頁(yè)尺寸按打印機(jī)當(dāng)前分辨率計(jì)算 QSize pageSize printer-pageLayout().paintRectPixels( printer-resolution(), printer-pageLayout().fullRect()); QSize reqSize pageSize; // 向量渲染時(shí)直接采用 1:1 像素 QPdfDocumentRenderOptions opts; opts.setRenderFlags(QPdfDocumentRenderOptions::RenderOptimizedForLcd); QImage pageImage m_doc.render(pageIndex, reqSize, opts); if (pageImage.isNull()) { painter.drawText(100, 100, 當(dāng)前頁(yè)渲染失敗); return; } // 畫(huà)到目標(biāo)矩形里保持縱橫比 QImage scaled pageImage.scaled(targetRect.size().toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation); QRectF centered QRectF(targetRect.topLeft(), scaled.size().toSizeF()); centered.moveCenter(targetRect.center()); painter.drawImage(centered.topLeft(), scaled); }這段代碼先算了目標(biāo)矩形來(lái)源是打印機(jī)的寬高——注意這寬高不是像素而是當(dāng)前分辨率下的“邏輯像素”300 DPI 下 A4 紙的寬約 2480高約 3508。QPdfDocument::render 的第二個(gè)參數(shù)就是輸出的像素尺寸這里直接用與打印機(jī)一致的像素尺寸避免縮放損失。render 返回的 QImage 是按頁(yè)面旋轉(zhuǎn)方向處理過(guò)的結(jié)果直接縮放繪制即可。Highlight 區(qū)域的繪制用的是比例縮放加居中這樣 PDF 寬高比和打印紙不一致時(shí)兩側(cè)留白而不是拉伸變形。注意這個(gè)實(shí)現(xiàn)里沒(méi)有處理多頁(yè)循環(huán)因?yàn)?QPrintPreviewWidget 的 SinglePage 模式下每次繪制回調(diào)只畫(huà)當(dāng)前頁(yè)打印時(shí)才需要遍歷全部頁(yè)這部分在下一節(jié)補(bǔ)上。3.4 多頁(yè)打印打印循環(huán)與預(yù)覽的差別預(yù)覽控件走的是“每次畫(huà)一頁(yè)”的路徑但 QPrinter 真正打印時(shí)需要在一個(gè)連續(xù)繪制會(huì)話里輸出所有頁(yè)用 newPage() 推進(jìn)紙張。常見(jiàn)的錯(cuò)誤是把打印循環(huán)直接套用預(yù)覽回調(diào)導(dǎo)致打印出來(lái)只有第一頁(yè)。正確的打印函數(shù)獨(dú)立實(shí)現(xiàn)void PdfPreviewWindow::printDocument() { QPrinter printer(QPrinter::HighResolution); printer.setPageSize(QPageSize(QPageSize::A4)); printer.setResolution(300); QPrintDialog dialog(printer, this); if (dialog.exec() ! QDialog::Accepted) return; QPainter painter; if (!painter.begin(printer)) { return; // 打印機(jī)初始化失敗時(shí)直接退出避免后續(xù)崩潰 } painter.setRenderHint(QPainter::Antialiasing, true); for (int page 0; page m_doc.pageCount(); page) { QPdfDocumentRenderOptions opts; QSize pageSize printer.pageLayout().paintRectPixels( printer.resolution(), false); QImage img m_doc.render(page, pageSize, opts); if (!img.isNull()) { painter.drawImage(0, 0, img); } if (page ! m_doc.pageCount() - 1) { printer.newPage(); // 非最后一頁(yè)才換紙 } } painter.end(); }代碼里 pageLayout().paintRectPixels 在 Qt 5.15 及以上可用作用是拿到頁(yè)面可繪制區(qū)域的實(shí)際像素矩形啃到渲染尺寸與打印紙匹配。最后一頁(yè)不調(diào)用 newPage防止輸出空白頁(yè)尾頁(yè)這是一處實(shí)操易忘的細(xì)節(jié)。打印循環(huán)里不再做縮放居中因?yàn)?PDF 頁(yè)面本來(lái)就是 A4 或可由 QPdfDocument 按要求縮放直接鋪滿頁(yè)面最穩(wěn)妥。預(yù)覽與打印共用的協(xié)調(diào)點(diǎn)在于兩者都在同一個(gè)分辨率300 DPI下渲染頁(yè)面預(yù)覽看到的頁(yè)邊距、內(nèi)容占比和打印輸出一致。如果預(yù)覽用 150 DPI 打印用 300 DPI文字會(huì)顯得“預(yù)覽剛好打印偏小”這是后文要重點(diǎn)說(shuō)的坑。4. 預(yù)覽參數(shù)與打印參數(shù)分辨率、頁(yè)邊距、縮放模式的五組必調(diào)參數(shù)4.1 分辨率決定預(yù)覽清晰度與打印質(zhì)量的根因QPrinter 的 setResolution 直接影響兩個(gè)環(huán)節(jié)預(yù)覽渲染用的 QImage 尺寸和打印輸出的物理點(diǎn)密度。分辨率設(shè)低了PDF 渲染出的圖片像素少預(yù)覽窗口一放大就有鋸齒打印出來(lái)字體明顯發(fā)虛設(shè)高了內(nèi)存占用和渲染耗時(shí)會(huì)上升頁(yè)面多的時(shí)候速度體感很差。一般我會(huì)按兩個(gè)場(chǎng)景分開(kāi)設(shè)預(yù)覽時(shí)用 150200 DPI 左右打印時(shí)用 300 DPI 甚至更高。不要在 QPrintPreviewWidget 構(gòu)造時(shí)傳一個(gè)高分辨率打印機(jī)然后在回調(diào)里又要求低分辨率渲染否則預(yù)覽和打印的顏色、密度對(duì)不上。如果一定只用一個(gè)打印機(jī)對(duì)象統(tǒng)一的取值以打印需求為準(zhǔn)——因?yàn)榇蛴≥敵鍪遣豢赡娴念A(yù)覽模糊還能忍打印糊了沒(méi)法交代。具體參數(shù)上普通文字文檔 300 DPI 是性價(jià)比最高的檔位矢量圖形和表格線條也會(huì)清晰。600 DPI 留給帶有小字號(hào)注腳或者精細(xì)工程圖的文檔再往上就主要消耗 CPU 和內(nèi)存觀感差異已經(jīng)不大。預(yù)覽控件的顯示縮放和分辨率是兩個(gè)維度分辨率負(fù)責(zé)“渲染原圖質(zhì)量”zoomFactor 負(fù)責(zé)“顯示放大倍率”不要混為一談。4.2 頁(yè)面大小與方向打印機(jī)紙張和 PDF 頁(yè)面不一致時(shí)PDF 頁(yè)面大小與打印機(jī)紙型不總是一致。常見(jiàn)的情況PDF 是按 Letter 排版的打印機(jī)默認(rèn) A4結(jié)果打印出來(lái)四周被裁掉一塊或者留出很大的空白。QPrintPreviewWidget 預(yù)覽時(shí)用的是 QPrinter 當(dāng)前設(shè)置的紙張大小如果 PDF 是 Letter渲染圖片按 KeepAspectRatio 縮放居中預(yù)覽看著正常但打印時(shí)會(huì)按打印機(jī)的物理紙槽走可能裁切。規(guī)避思路加載 PDF 后讀取文檔第一頁(yè)的頁(yè)面尺寸嘗試據(jù)此設(shè)置 QPrinter 的頁(yè)面。QPdfDocument 的 pagePointSize 方法可以拿到頁(yè)面尺寸的 point 值再換算成 QPageSize 設(shè)置給打印機(jī)。代碼寫(xiě)法如下QSizeF pdfPageSize m_doc.pagePointSize(0); // 返回的是 point QPageSize pageSize(pdfPageSize, QPageSize::Point); m_printer-setPageSize(pageSize);這里單位是 point1 point 等于 1/72 英寸。這樣設(shè)置后打印機(jī)紙張會(huì)跟隨 PDF 實(shí)際尺寸減少裁切。方向上同理如果第一頁(yè)是橫向而默認(rèn)縱向需要判斷寬高比后調(diào)用 setPageOrientation 調(diào)整否則頁(yè)面旋轉(zhuǎn) 90 度是常見(jiàn)事故。4.3 頁(yè)邊距寧可在預(yù)覽里縮不要在打印里摳QPrinter 的頁(yè)邊距有兩個(gè)來(lái)源一個(gè)來(lái)自打印機(jī)的不可打印區(qū)域也就是硬件物理邊距另一個(gè)來(lái)自 QPageLayout 的 margins 設(shè)置屬于軟件層內(nèi)容邊距。預(yù)覽控件顯示的是前者約束下的物理紙張如果你的頁(yè)碼或者表格線剛好畫(huà)在硬件邊距內(nèi)預(yù)覽里看著沒(méi)問(wèn)題打印出來(lái)會(huì)被裁掉或噴到紙外。解決方案有兩個(gè)方向。第一是接受硬件邊距把所有內(nèi)容繪制限定在 paintableRect 內(nèi)適合成品打印。第二是設(shè)置頁(yè)邊距為 0QPrinter 會(huì)自動(dòng)把內(nèi)容盡量居中在物理可打印區(qū)域內(nèi)適合需要最大化利用紙張的場(chǎng)景。如果你設(shè)計(jì)時(shí)已經(jīng)預(yù)留了固定出血邊距就用 QPageLayout::setMargins 指定毫米值QMarginsF margins(10.0, 10.0, 10.0, 10.0); // 單位毫米 m_printer-setPageMargins(margins, QPageLayout::Millimeter);建議直接在預(yù)覽階段就套用最終打印的邊距參數(shù)這樣預(yù)覽看到的白邊就是打印出來(lái)的白邊。不要預(yù)覽時(shí)用零邊距打印時(shí)又加上 20 毫米互相抵消的后果是內(nèi)容位置不可預(yù)期。4.4 縮放模式、頁(yè)序與翻頁(yè)細(xì)節(jié)QPrintPreviewWidget 提供的 look 相關(guān)接口里有幾個(gè)高頻使用項(xiàng)。setZoomFactor 設(shè)置的是顯示縮放倍率1.0 代表 100% 按物理尺寸顯示大于 1 放大小于 1 縮小。fitToWidth 和 fitInView 是按頁(yè)面寬度或整個(gè)頁(yè)面適配窗口的自動(dòng)模式更適合第一次打開(kāi)文檔時(shí)使用兩者都會(huì)覆蓋手動(dòng)設(shè)置的 zoomFactor。預(yù)覽控件自帶 setCurrentPage 方法控制當(dāng)前顯示頁(yè)connect 它的 pageChanged 信號(hào)可以在翻頁(yè)時(shí)同步你的狀態(tài)欄或者工具欄。另外一個(gè)不太顯眼的接口是 setEnabled 和 updatePreview 的組合加載新文檔后必須先 setCurrentPage(0) 再 updatePreview否則控件可能停留在上一份文檔的尾頁(yè)附近出現(xiàn)示意上的錯(cuò)位感。頁(yè)序問(wèn)題主要影響打印環(huán)節(jié)。某些打印驅(qū)動(dòng)支持“逆序打印”如果你的循環(huán)是從第 0 頁(yè)到最后一頁(yè)配合打印驅(qū)動(dòng)自帶的逆序選項(xiàng)就會(huì)導(dǎo)致硬編碼順序和驅(qū)動(dòng)順序疊加出錯(cuò)。一般建議代碼里保持自然頁(yè)序把逆序交給打印對(duì)話框設(shè)置不要兩頭都管。4.5 五組常用參數(shù)的速查表與推薦配置下面這張表匯總了這套預(yù)覽方案最常改動(dòng)的參數(shù)及落地取值方便直接對(duì)照設(shè)置參數(shù)項(xiàng)接口位置預(yù)覽場(chǎng)景建議打印場(chǎng)景建議渲染 DPIQPrinter::setResolution150~200300 起精細(xì)圖 600頁(yè)面大小QPrinter::setPageSize跟隨 PDF 首頁(yè)尺寸與紙槽一致頁(yè)邊距QPageLayout::setMargins與打印一致按成品需求設(shè)顯示縮放QPrintPreviewWidget::setZoomFactor1.0 或 fitToWidth不參與打印預(yù)覽頁(yè)序QPrintPreviewWidget::setCurrentPage自然頁(yè)序循環(huán)按自然頁(yè)序這套配置里唯一要?jiǎng)幽X筋的是 DPI 和頁(yè)邊距兩組。DPI 影響渲染圖片的像素總量不建議盲目拉高預(yù)覽里 200 DPI 配合 fitToWidth 在普通屏幕上已經(jīng)足夠銳利打印時(shí) 300 DPI 能覆蓋絕大多數(shù)辦公場(chǎng)景。頁(yè)邊距則要盡早固定因?yàn)樗苯佑绊懪虐孀鴺?biāo)中途改動(dòng)會(huì)牽連所有頁(yè)面元素的位置計(jì)算。5. 六條踩坑記錄空白頁(yè)面、雙屏縮放、資源釋放這些毛病怎么查5.1 預(yù)覽控件一片空白但直接打印卻有內(nèi)容現(xiàn)象QPrintPreviewWidget 窗口正常顯示但頁(yè)面區(qū)域完全空白工具欄的頁(yè)數(shù)信息也是對(duì)的。原因有兩個(gè)高頻來(lái)源一是打開(kāi) PDF 后沒(méi)有調(diào)用 updatePreview()控件根本不知道文檔已經(jīng)變化二是 paintRequested 回調(diào)里 QPdfDocument::render 的請(qǐng)求尺寸傳了空值返回的 QImage 是空的。解決先確認(rèn) load 返回成功隨后強(qiáng)制調(diào)用 updatePreview()。如果還空白在回調(diào)里對(duì) render 結(jié)果判空并打印調(diào)試信息。另外檢查回調(diào)綁定的 QPrinter 是不是構(gòu)造預(yù)覽控件時(shí)傳入的那一個(gè)如果連接信號(hào)時(shí)用了別的打印機(jī)對(duì)象繪制坐標(biāo)系不匹配也會(huì)導(dǎo)致輸出位置錯(cuò)亂。5.2 預(yù)覽很清晰打印出來(lái)的文字卻發(fā)虛現(xiàn)象同一份 PDF 在預(yù)覽窗口里看起來(lái)銳利無(wú)瑕送到打印機(jī)后文字邊緣模糊像低分辨率放大。原因預(yù)覽和打印用了同一個(gè) QPrinter 對(duì)象加載 PDF 渲染時(shí)按預(yù)覽窗口 DPI 計(jì)算尺寸真正打印時(shí)沒(méi)有重新設(shè)置 QPrinter 的分辨率導(dǎo)致輸出圖形的點(diǎn)陣密度不足。解決把預(yù)覽用打印機(jī)和打印用打印機(jī)分開(kāi)。預(yù)覽用一個(gè)獨(dú)立的 QPrinter 調(diào) 200 DPI 顯示打印時(shí)在 printDocument() 里新建 QPrinter 并設(shè) 300 DPI分別驅(qū)動(dòng)渲染。如果項(xiàng)目代碼里確實(shí)只想用一個(gè)打印機(jī)就必須在打印前重新 setResolution 并重新 render 頁(yè)面不要復(fù)用之前緩存的 QImage。5.3 高分屏上頁(yè)面邊緣出現(xiàn) 1 像素白線現(xiàn)象在 2K 或 Retina 屏上預(yù)覽 PDF 時(shí)頁(yè)面邊緣偶爾出現(xiàn)細(xì)白線截圖放大后能看到是渲染圖沒(méi)有完全覆蓋目標(biāo)矩形。原因QImage 縮放時(shí)尺寸取整目標(biāo)矩形是浮點(diǎn)值但 drawImage 用的是整數(shù)坐標(biāo)縮放后差 1 像素沒(méi)有填充。解決繪制前計(jì)算目標(biāo)矩形后再做一次取整處理保證 drawImage 的目標(biāo)區(qū)域與原圖寬高比誤差小于 1 像素。最簡(jiǎn)單的方法是 scaled 后用 QRectF 顯式對(duì)齊QSizeF targetSizeF targetRect.size(); QSize targetSize QSize(qRound(targetSizeF.width()), qRound(targetSizeF.height())); QImage scaled pageImage.scaled(targetSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); painter.drawImage(targetRect.x(), targetRect.y(), scaled);5.4 大 PDF 文件反復(fù)翻頁(yè)時(shí)內(nèi)存持續(xù)上漲現(xiàn)象打開(kāi)一份幾百頁(yè)的掃描版 PDF連續(xù)翻頁(yè)半小時(shí)后程序內(nèi)存占用從三百兆漲到接近一個(gè) G。原因每翻一頁(yè)都在渲染一張全尺寸 QImage翻過(guò)的頁(yè)沒(méi)有主動(dòng)釋放連 Qt 自己的圖片緩存也沒(méi)有清理。解決分兩塊處理。第一是渲染前檢查 pageImage 是否仍然引用舊數(shù)據(jù)直接在循環(huán)里用局部變量承接 render 結(jié)果出作用域就釋放第二是借助 QPdfDocument 自帶的頁(yè)面緩存控制設(shè)置 document 的 DocumentRender 參數(shù)限制緩存頁(yè)數(shù)避免無(wú)限增長(zhǎng)。翻頁(yè)極多且圖片巨大的文檔建議直接降預(yù)覽分辨率到 150 DPI肉眼差別有限但內(nèi)存減半。5.5 文件名帶中文或空格怎么也打不開(kāi)現(xiàn)象同一個(gè) PDF 文件路徑改成純英文就正常改成中文路徑就加載失敗。原因是 Qt 在部分平臺(tái)或編碼環(huán)境下對(duì)本地文件名解析依賴(lài)系統(tǒng)代碼頁(yè)中文路徑落入非 UTF-8 語(yǔ)義時(shí) QPdfDocument 讀不到文件。解決先確認(rèn)文件確實(shí)存在再用 QFile::exists 快速排除路徑拼寫(xiě)問(wèn)題。穩(wěn)定做法是把路徑轉(zhuǎn)為標(biāo)準(zhǔn)路徑后傳入QString filePath input-text().trimmed(); QFileInfo info(filePath); if (!info.exists()) return; QString canonicalPath info.canonicalFilePath(); m_doc.load(canonicalPath); // 使用規(guī)范化絕對(duì)路徑canonicalFilePath 返回的是絕對(duì)路徑而且消除了路徑里的相對(duì)段和符號(hào)鏈接干擾能有效減少編碼引起的加載失敗。5.6 雙面打印時(shí)偶數(shù)頁(yè)缺失或順序顛倒現(xiàn)象啟用打印對(duì)話框里的雙面打印后輸出結(jié)果出現(xiàn)奇數(shù)頁(yè)和偶數(shù)頁(yè)混排原本的第 2 頁(yè)跑到第 7 頁(yè)的位置。原因很多打印機(jī)驅(qū)動(dòng)只負(fù)責(zé)物理翻面不負(fù)責(zé)頁(yè)碼順序重排需要應(yīng)用程序在打印循環(huán)里按雙面規(guī)則輸出或者關(guān)閉驅(qū)動(dòng)側(cè)的頁(yè)序處理。解決簡(jiǎn)單方案是在打印對(duì)話框里關(guān)閉自動(dòng)雙面保持代碼輸出自然頁(yè)序。如果必須支持驅(qū)動(dòng)雙面就在循環(huán)里先輸出全部奇數(shù)頁(yè)再輸出全部偶數(shù)頁(yè)并把驅(qū)動(dòng)端的逆序關(guān)閉。更可控的方案是自己在代碼里組織雙面打印for (int odd 0; odd m_doc.pageCount(); odd 2) { // 先打印奇數(shù)頁(yè)再打印對(duì)應(yīng)的偶數(shù)頁(yè) }這塊沒(méi)有絕對(duì)通用的版本不同驅(qū)動(dòng)的行為差異很大建議在目標(biāo)打印機(jī)上實(shí)際打一份三頁(yè)的測(cè)試文檔驗(yàn)證。6. 進(jìn)階滾動(dòng)連續(xù)預(yù)覽、縮略圖導(dǎo)航與驗(yàn)證方法6.1 用 QScrollArea 包裝 QPrintPreviewWidget 實(shí)現(xiàn)連續(xù)瀏覽SinglePage 模式翻頁(yè)適合閱讀單頁(yè)文檔但面對(duì)多頁(yè) PDF用戶會(huì)更習(xí)慣滾動(dòng)瀏覽的體驗(yàn)。把 QPrintPreviewWidget 放進(jìn) QScrollArea 只是第一步重點(diǎn)在尺寸同步預(yù)覽控件的高度應(yīng)隨當(dāng)前頁(yè)數(shù)和縮放系數(shù)更新否則滾動(dòng)范圍始終只有一屏。常見(jiàn)做法是監(jiān)聽(tīng) zoomFactorChanged 和文檔加載完成信號(hào)重設(shè) preview 的 minimumHeight 為所有頁(yè)面高度之和示例代碼如下connect(preview, QPrintPreviewWidget::zoomFactorChanged, this, [this](qreal factor) { int totalHeight m_doc.pageCount() * preview-height() * factor; preview-setMinimumHeight(totalHeight); });6.2 縮略圖導(dǎo)航與當(dāng)前頁(yè)高亮多頁(yè)文檔沒(méi)有縮略圖導(dǎo)航翻頁(yè)效率很低。可以用 QListWidget 配合 QPdfDocument 的縮略渲染為每一頁(yè)生成小尺寸預(yù)覽圖點(diǎn)擊后同步 QPrintPreviewWidget 的 currentPage用列表選中的高亮作為當(dāng)前頁(yè)指示。優(yōu)點(diǎn)是不需要引入額外控件庫(kù)幾十行就能實(shí)現(xiàn)一個(gè)可用的導(dǎo)航欄代價(jià)是縮略圖需要額外渲染一次文檔頁(yè)數(shù)多時(shí)建議用 120px 寬度渲染并緩存到內(nèi)存里避免每次點(diǎn)擊重新生成。6.3 驗(yàn)證效果用“渲染對(duì)比”代替肉眼抽查預(yù)覽界面做得再舒服最終交付的是打印輸出驗(yàn)證環(huán)節(jié)不能省。我的習(xí)慣是先把 PDF 頁(yè)導(dǎo)出為 PNG 參考圖再用同一套渲染函數(shù)把頁(yè)面畫(huà)到 QPrinter 上最后對(duì)比打印輸出或再次渲染的結(jié)果。由于代碼里預(yù)覽和打印共用 renderPdfPage 的繪制邏輯這份對(duì)比能直接發(fā)現(xiàn) DPI 不一致、邊距偏差這類(lèi)問(wèn)題。另一個(gè)驗(yàn)證手段是生成 PDF 后檢查頁(yè)數(shù)循環(huán)里最后一頁(yè)不調(diào)用 newPage 的寫(xiě)法在空文檔或者尾頁(yè)為空白頁(yè)時(shí)最容易漏掉打印前先打印一行日志記錄 pageCount比事后翻紙快得多。這套方案做到現(xiàn)在最大的教訓(xùn)是“先定分辨率再定邊距”順序反了后面所有排版的坐標(biāo)都要返工。文檔預(yù)覽在內(nèi)部工具里不算核心功能但做砸了會(huì)直接拖累主流程的信任度。希望這篇記錄下來(lái)的做法能幫你少走幾段彎路希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97久久超视频| 操久久网| 五月丁香亭亭| 亚洲网站999| 亚洲五月婷婷在线| 性爱先锋AV| 91九九九色在| 玖玖婷婷色欲| 五月婷婷涩涩爱| 精品网站:999WWW| 国产婷婷五月中文字幕高清| 久操人妻| 中文字幕在线日亚洲9| 色一色综合| 99啪啪| 99re热视频| 婷婷五月婷婷| 丁香婷婷六月激情| 色青青五月| 99九九综合久久九九| 玖玖九九超碰| 香蕉曰比| 丁香婷婷浪潮AV久久综合| 婷婷开心激情| 91狠狠综合久久久| 囯产精品久久欠久久久久久九大| 色色色色网| 99a级片| 日夜夜久久| 97色色-99久久| 色九亚洲| 日本一道久久| 偷拍五月丁香| www.五月天| 亚洲操b| 伊人久久婷| 天天搞天天爽| 色色婷婷丁香五月天| 丁香丁香激情网| 五月婷婷中字在线| 日韩av在线电影| 色婷婷五月天激情综合| 欧美婷婷五月无砖| www国产亚洲色婷婷com| 狠狠色噜噜| 婷婷综合在线观看视频| 色色色色色网站| 久久久区区一久久久久久| 五月香蕉婷婷| 99免费热视频| 91狠狠色色丁香婷婷综合久久| 五月婷婷激情综合网| 五月天停停基地| 婷婷丁香五月激情中文字幕版| 99在线观看亚洲| 黄色AV日韩| 激情久久五月天| 色婷婷免费视频| 五月婷婷丁香啪啪| 婷婷五月天AV| 日日天天干| 丁香五月播播| 五月激情四射网站| 狼人婷婷久久| 九九在线免费观看| 色久影院| 日韩精品一区二区三区,四区,五区视频| 99热官网| 停停综合色色| 天天干天天日天天插| 99成人精品| 五月天堂在线| 久草大| 狠狠干狠狠干| 婷婷激情综合色五月久久91| 狠狠操狠狠爱| 日本色狠狠| 另类图片激情五月| 综合福利网| 影音先锋91视频| 99色日本| 亚洲性爱日韩无码| 五月婷婷色情| 狠狠色九月| 影音先锋一区| 天天综合网亚洲网站| 97热在线精品| 色九九中文字幕| 99在线视频女女视频| 五月色丁香| 丁香婷婷五月天亚洲| 26UUU精品一区二区Com| 久久9视频| 乱岳熟女50岁| 99操久久| 丁香六月综合激情| 色婷婷狠狠18yy| 婷婷伊人75| 亚洲激情综合| 欧美日韩国产一区二区| 99这里只有精彩视频| 影音先锋一区| 9久热在线精品| 五月天啪啪视频| 色婷婷香蕉丁丁网| 人人操AV| 欧美日韩成人| 色综合区| 伊人婷婷大香蕉| 丁香婷婷色五月天| 亚洲av| 综合久久高清| 亚洲无码yw| 国产真实乱了老女人视频| 丁香视频| 天天狠狠六月婷丁香影院| 日本人妻A片成人免费看片| 狠狠综合久久综合| 婷婷草| 欧美性猛交 XXXX 乱大交| 欧美日韩国产一区| 激情綜合網址| 久久99精品久久久久久噜噜| 五月婷婷六月情| 色www久视频| 亚洲精品电影| 91日本在线| 97人妻人人| 欧美美女国产日韩一区二区久 | 国产精品久久7777777精品无码| 色欲天天综合| 91狠狠色| 国产激情视频在线观看| 99在线精品视频免费| 丁香五月成人婷婷| 成人Av在线大片| 99久久大片| 欧美69久成人做爰视频| 六月伊人婷婷| 丁香五月婷婷图片综合| 天天夜夜操| 午夜不卡久久精品无码免费| 激情婷婷亚洲五月| 久cao香蕉影院| 99成人| 婷婷色五月天色| 五月天国产婷婷精品视频在线| 丰满少妇猛烈A片免费看观看 | 久久性爱视频| 啪啪啪综合网| 国产SUV精品一区二区883| 狠狠做六月爱婷婷综合aⅴ| 99久.| 熟女网站久久| AV九九| 婷婷九月| 日日操夜夜擼| 色停停五月,在线观看| 亚州精品成人片| 一级操逼内射在线视频| 国产老熟妇亲子乱对白| 婷婷啪啪| www天天爽| 99热九九九九| 99ri在线| 婷婷色丁香五月| 影音先锋男人AV资源站| 亚洲综合无码| se色99| 欧洲电影在线观看免费版英语版| 国产三级秋霞| 天天日天天舔天天摸| 97碰在线视频| 色五月激情| 粉嫩av蜜桃av蜜臀av| 99碰碰| 色婷婷丁香五月| 激情五月深爱五月观看| 中文字幕操比影片| 91操人视频| 丁香五月婷婷少妇| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 99热在线播放| 激情久久丁香| 五月永久激情| www.jiujiujiu| 婷婷五月六月丁香| 色J香五月天| 《久久综合九色综合97婷婷| 超pen个人视频97| 激情综合网五月天| 亚洲色色爱| 久久38视频| 久久99久久99精品免观看粉嫩| 狠狠色婷婷7777久| 五月天婷婷激情网| 黄色视频网站在线播放| 九九亚洲视频| 色婷婷丁香五月天在线观看| 五月婷婷视频啪啪美女| 国产精品99久久久久久猫咪| 91呦呦呦| 最近中文字幕在线中文视频| 久热AA| 色国产五月| 网色99| 五月天成人网在线观看| 91成人性爱视频| 久久久婷| 99激| 激情四射婷婷| 色色色五月天婷婷| 啊V视频在线观看| 婷婷五月天成人娱乐| 九色在线五月婷婷网址| 久热婷婷| 久久丁香五月婷| 日韩在线视频网站| 国产99久| 女人天堂AV| 亚洲 五月 婷婷 成人| 久久精品五月| 国产精产国品一二三在观看| 激情图片婷婷丁香五月| 久久久99精品| 五月婷婷干干干| 九热网站| 亚洲激情久久| 亚洲成人超碰| 免费观看欧美成人AA片爱我多深 | 日本99在线| 婷婷六月激情啪啪| 天天色天天射天天日| 国产午夜精品一区二区三区嫩草| 亚洲99综合| 狠狠五月天婷婷激情网。| 亚洲99综合| 婷婷色网址| 久热无码| 97性视频| 天堂网色色| 久久99热这里只频精品6学生| 色欲久久久久| 丁香六月爱综合| 六月婷久久| 91色性感五月婷婷丁香| 婷婷九月色| 欧美久久网| 激情小说之五月| 天堂A∨在线| 亚洲韩国日产综合AV| 五月丁香五月婷婷| 久久久精品色| 五夜婷婷| 五月丁香啪啪啪综合网| 久9热视频| 99热在线这里| 婷婷开心久久| 99综合激情久久精品久久| 丁香六月婷婷综合激情欧美 | 国产亚洲成AV人片在线观黄桃| 色激情五月| 五月丁香欧美在线| 天天精品视频在线观看视频| wwwxxx五月婷婷小说| 婷婷五月天在线看| 色婷婷丁香五月天| 五月丁香香蕉| 噜噜噜噜婷婷五月天| 婷婷综合色网| 99综合自拍| 婷婷自拍| 免费播放片大片| txt五月激情四射网综合俺也来了 五月天婷婷丁香人人操91 | www.五月天| 国产精品国产| 99热e| 五月天成人网在线观看| 亚洲色网络| 久久激情五月网| 白天AV月月| 夜夜天天久久婷婷| 婷婷五月天首页| 99热首页在线30| 我爱宗和色| www.狠狠狠.com| 中文字幕婷婷五月天| 激情五月天电影| 专区无日本视频高清8| 亚洲色婷婷| 婷婷月综合| 婷婷的色色五月天| 色久九| 婷婷五月综合网| 美欧日韩国产成人在战| 26uuu| 天天插综合| 久久综合九九| 亚洲中文字幕在线观看| 国产av第一专区| 亚洲殴洲精品Av在线| 日本丰满久久| 国产脫衣舞一区二区三区| 久久久99视频| 亚洲天堂AV免费片| 精品无码99| 丁香五月天论坛| 天天摸天天舔| 国产午夜一区二区三区| 无遮挡国产高潮视频免费观看 | 99热久| A片试看120分钟做受视频红杏| 成熟妇人A片免费看网站| ..真实国产乱子伦对白在线_欧| 国产精产国品一二三在观看| 亚洲婷婷综合视频| 色九区| 美女五月天婷婷| 日日操,日日爽| 天天成人综合视频| 激情五月天啪啪| 久久香蕉网| 中文人妻AV久久人妻18| 超色欲天天| 女婷久久| 婷婷综合伊人丁香| 伊人激情啪啪| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 深爱婷婷丁香五月激情| 超碰AV在线| 免费无码毛片一区二区A片| av一级棒av| av在线观看网址| 色婷婷亚洲| 国产va在线视频| 五月情婷婷| 成人短视频在线观看| 成人午夜天| 五月婷婷亚洲色图| 热无码A∨| 大鸡巴伊人网| 狠狠丁香| 能直接看的av网站| 国产乱妇无乱码大黄AA片| 思思干精品| 站长推荐无码播放| 五月婷婷婷自由综合| 五月天开心网| 色婷婷丁香花五月天| 99热这里有精品首页10| 五月丁香九九九综合| 婷婷五月天狠狠色| 午夜精品久久久久久久爽| 九九九九九九综合| er99免费视频在线| www.色99| 99人人操| 五月婷婷综合潮喷| 色色色色综合网| 婷婷中文字暮| 人人干AV| 婷婷91| 色色色9 9 9| 婷婷五月 丁香六月| 欧美激情VA永久在线播放| 亚洲精品又粗又大又爽A片| 丁香久月婷| 天天干天天操天天上| AV五月丁香| 五月停停大香蕉| 久久99网站| 99热首页| 欧美精品狠狠色丁香婷婷| 99色热| 99无码黄色视频| 中文激情网| 日韩日比视频| 美女五月天| 大地资源色婷婷视频在线| 99网址在线看| 五月丁香婷婷综合久久| 99精品视频免费| 超级碰碰97在线| 99er这里只有精品| 91综合在线| 激情av网| 色播五月婷婷五月| 婷婷天天五月天| 桃色激情婷婷伊人网| 婷婷丁香激情综合色情| 久青操| 亚洲综合色色色| 9色91视频| 久久这里都是精品免费| 五月婷婷激情综合网| 91日视频| 色色无码| 婷婷精品综合| 丁香五婷婷| 人人爽欧美婷婷久久久五月丁香| 激情五月天伊人影院| 91夫妻视频| 狠狠狠人妻| 精品一区二区三区免费毛片爱| www.久久| 狠狠综合| 五月丁香婷婷激情在线| 超碰日韩成人| 五月婷婷在线观看| 亚洲视频另类| site:pnnrt.com| wuyuedingxiang| 久久这里只有精品22| 免费无码毛片一区二区A片| 成人视频九九| 精品少妇人妻AV无码专区偷人| 婷婷五月情色| 碰碰碰97国产| 这里只有精品免费视频| 久操大| 色蜜婷婷| 99色婷婷视频| 九九热10| 超碰成人黄色网| 丁香五月人妻熟女| 无码动漫AV| 99网| 亚洲激情av| 婷婷视频网| 婷婷狠狠久久| 偷拍99在线视频观看| 色五月婷婷在线观看| 91色碰| 婷婷六月色开 | 亚洲欧洲中文日韩久久AV乱码| 日日操夜夜爽天天天| 婷婷婷婷婷婷婷婷婷婷丁香| 五月天综合激情网| 久久久精品AV| 成人AV在线电影| 五月婷婷激情色情网| 99色人| 丁香五月天成人网站| 婷婷97碰碰| 色五月在线播放| 五月激情另类| 午夜av网| 久久九九国产精品怡红院| 颜射 精品性爱av| 亚洲综合视频八| 播五月开心婷婷欧美综合| 久久多色| 日韩丁香涩| 丁香婷婷影院| 夜夜操夜夜爽| 99资源在线| 一起草av| 亚洲va欧洲va国产va不卡| 超碰在线99热| 无码少妇高潮喷水A片免费| 五月婷婷开心综合| 久久五月天色婷婷| 这里有精品| 另类亚洲2| 日日干四虎| 五月丁香婷婷免费视频| 五月天成人在线视频丁香| 丁香五月婷婷www..com| 婷婷在线视频| h在线看免费版在线看| 国产VA播放| 欧美六月婷婷| 亚洲成av人影院| 九九热精品在线| 97丁香花五月天激情小说| 亚洲天堂青草| 久久精品99国产精品日本| 狠狠干夜夜干| 涩涩涩婷婷| 影音先锋91| 色网五月婷婷| 97伦色婷婷| 日本3级片一区2区| 九九综合视频在线观看| 五月天婷婷丁香视频| 猫咪伊人久久| 丁香婷婷人妻综合网| 大香线蕉伊人| 丁香九色不卡aaa| 91欧美| 亚洲色婷婷| 五月婷婷影视| 天堂婷婷五月在线| 五月天色色网站| 碰人人97| 色婷婷丁香花五月天| 狠狠综合| 欧美性爱一区| 日韩aaa| 色色色色色色色色色999| 婷婷色色五月天| 色婷婷AⅤ| 丁香五月婷婷国产av| 夜夜谢天天干| 九九色逼| 久综合网| 91丨九色丨熟女|新版| 婷婷五月天开心激情网| 影音先锋人妻出差| 99色热视频| 天天摸.天天mo| 激情久久久久久久久久久| 丁香五月婷婷香| 亚洲精品久久久无码| 婷婷六月久久综合导航| 久热一本| 99激情在线| 亚洲免费观看高清完整版AV线| 99热99热在线| 九九婷婷五月天| 婷婷九月丁香久久| 天天干天天操天天上| 开心四月婷婷在线色播播| 伊人春天av| 色婷婷久久| 色婷婷免费观看| 五月天天综合| 99热久草| 久久九九综合| 婷婷五月天播| 精品网站99| 亚洲色色在线| 久久五月婷综合网| 久久成人天| 热久久视频99| 婷婷色五月综合| 无月播播激情在线观看视频| 六月婷婷久久大全| 婷婷婷婷色| 久久99精品久久只有精品| 开心激情播播五月天| 五月天激情开心网| 五月婷婷丁香俺日污视频| 99爱这里只有精品免费视频| 五月丁香成人网| 亚洲综合另类| 亚洲av骚货| 欧美成人va| 欧美丰满熟妇BBB久久久| 色色国产| 九九精品免费视频99| 免费色婷婷| 中文字幕久久婷九女同| 五月 成人 婷婷| 大香蕉久操| 欧美五月停| 天天射综合网站| 激情婷婷久久| 人人操人人操919999| 天天久| 九九九九无码| 天天爱天天吃狠天天透| 婷婷五月天综合AV| 色五月激情五月开心五月| 久热精彩视频98| 久久综合激情婷婷激情| 欧美男女婷婷| 久久五月丁香| 成人 在线 日韩| 久久综合五月天| 伊人狠狠丁香婷婷综合尤物| 99ri国产| 色五月婷婷狠狠撸| 天天色天天操天天射| 在线综合婷婷| 97人碰人操| 热久久国产视频| 任你弄在线视频免费| 人人人va亚洲视频在线| 婷婷福利影院| 久久免费精彩视频| 九月丁香亭亭| 久热这里| 久久激情五月网| 91猫咪国产在线播放| 丁香 婷婷 亚洲 熟女| 欲色人妻| 成人网站免费在线播放| 婷婷丁香色五月亚洲| 欧美韩国日本| 婷婷五月花西瓜| 综合色吧| 婷婷久久久| 操操操操操电影网| 欧美三级黄色片久久| 色情综合网| 777.色色| 欲色人妻| 激情小说婷婷| 激情五月,激情综合网| 丁香婷婷色情| 婷婷丁香五月综合| 天天五月天综合网址| 亚洲成人AV在线播放| 天天综合精品| 五月婷丁香| 热99精品视频在线观看| 狠狠色综合无线观看| 日本色天堂| 五月婷婷熟女| 手机在线日韩视频中文字幕| 99精品偷自拍| 日本欧美国产| 五月天色在线| www婷婷| 色五月丁香五| 五月婷婷婷| 丁香六月婷婷综合在线| 色婷婷五月天中文字幕| 亚洲激情六月丁香| www.婷婷六月天| 日本天天色| 色。 日日日| 97婷婷丁香| 在线18av | 97婷婷狠狠| 思思热在线视频99| 一级片sese片.COM| 99热色婷婷| 久久精品一区二区三区四区| 色婷婷电影网| 亚洲另类日本| 欧美日本一区二区三区| 婷婷六月丁香在线| 日韩三及成人AV片| 综合色、色综合| 色五月天激情| 婷婷五月天综合在线| 深爱五月天 开心网| 日本不卡中文字幕| se色综合网| 4438亚洲欧美| 国产精产国品一二三在观看| 成人视频一区| 色色色在线观看| 激情综合五月色丁香婷婷| 欧美色狠婷久| 色综合久| 久久作爱| 99热这里有精品首页10| 婷婷综合伊人| 色婷婷播放| 欧美顶级少妇做爰HD| 99久热| 96精品久久久久久久久| 婷婷综合激情| 久久久性爱视频| 国模淫穴色图| www狠狠| 色五月天成人在线| 天天艹天天色| 日本九九热| 色婷婷最爱五月| 色婷婷婷av| 五月开心婷婷极品激情| 久久伊人大香蕉| 天堂色婷婷| 婷婷激情人妻| 婷婷99视频精品| 色女人久久| 九九大香视频| 色色色99| 综合五月草| 丁香五月精品视频| 婷五月丁香俺| 天天做天天干天天综合网| 色色色99韩| 婷婷的五月天另类视频| 呦呦v线| 巴基斯坦粉嫰无码视频| 久久久久99精品成人片| 亚洲第一精品网站| 亚洲人人操| 日本欧美国产| 99热这里只有精品3| 四色五月婷婷| 亚洲精品一区中文字幕乱码| 九九九九热99超碰| 国产精自产拍久久久久久蜜| www.激情五月| 六月天无码网址| 色色丁香婷婷五月天| 狠狠色成人影片| 青草青草久热这里只有精品| 爆乳熟妇一区二区三区四区| 五月天激情小说欧美激情| 色五月婷婷操逼| 国产激情久久久| 五月天色视频| 中文字幕视频在线播放| 黄色三级毛片中字| 狠狠五月天| 婷婷综合在线| wuyuedingxiang| 欧洲不卡视频| 久久开心五月婷婷| 开心五月综合激情网| 裸体做A爰片毛片A片免费| 天天爽天天干| 国产人妻777人伦精品HD| 9久9久9久女女女九九九一九| 激情文学第四色婷婷丁香五月| 色性综合| 五月婷婷无码| 亚洲天天| 9 1大香蕉| 久热久| 色高清无码视频| 99精品无码| 欧美交换配乱吟粗大25P| 亚洲AV成人精品网站在线播放| a色婷婷| 九九99视频精品| 色色性爱视频| 午夜少妇在线观看视频| 97五月婷婷| 狠狠狠人妻| 超碰色色综合| 丁香婷婷浪潮AV久久综合| 色综合色五月| 五月丁香中文字幕| 天天日天天爽| 狼友超碰| 另类五月激情| 亚洲日韩一页精品发布| 久久香蕉福利| 热思思| 9l视频自拍9l九色成人| 69久久99精品久久久久| 日本熟女一区二区| 九九久久99| 色色色五月婷| 久狠日av| 日本精品人妻无码77777| 99日本在线| 婷婷五月综合激情免费| 国产精品久久久久久久久久| 五月婷婷综合久久| 五月婷婷中文字幕| 四川女人毛多水多A片| 免费AAAAA网| 五月婷婷深深爱| 99精品九九| 五月天色婷婷小说| 成人av免费观看| 五月丁香啪啪综合| 极品另类| 九色在线观看91av| 亚洲色在线观看| 成人在线二区| 久久五月激情网| 婷婷久久网| 婷婷五月丁香综合| 99狠狠色| 婷婷丁香五月91| 天天插,天天射| www.99色在线| 五月婷婷九月婷婷九月婷婷| 岛国在线观看91| 国产婷婷综合| 欧美大肥婆大肥BBBBB| 久久婷婷五月综合| 日日综合网| 五月丁香999| 日韩无码成人电影| 五月丁香九九| 99热最新国内| 色域五月丁香| 国产超碰av| 激情综合九| 婷婷婷五月香蕉| 超碰啪啪网| 狠狠色婷婷色| 亚洲成人av在线播放| 四色五月视频| 亚洲午夜一区二区| 999激情视频| 九色自拍| 99re鈥哸鈥唙| 色婷婷四色| 97色色色| 91精品婷婷国产综合久久| 开心五月婷婷激情| 成人婷婷色五月天| 国产视频色色色色色色色 | 99色五月| 婷婷五月av| www久久久| 五月天久久www| 超碰在线资源| 2017狠狠干| 开心久久xxx色| AA片在线观看视频在线播放| 狠狠色噜噜| 大天天伊人| www.超碰| 人妻在线中文字幕久久| 另类丁香综合| 91碰碰碰| 亚洲丁香网| 日本人人干| 伊人在线视频| 开心五月深爱激情| 超碰在线免费9| 成人av免费观看| 国产色五月| 激情99| AA丁香综合激情| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 大香蕉75线| 久久久久人妻| 久久偷拍综合五月天| 色综合区| 久久婷婷五月天丁香| 激情av在线| 日本五月丁香| 色九月婷婷丁香| 天天做天天爱| 中文av网| 午夜九九电影| 色婷婷丁香九月| 国产AV一区二区三区日韩| 久久性爱视频| 伊人五月久久| 激情五月丁香社区| 国产麻豆视频| 综合啪啪| 夜夜夜夜夜操| 色五月婷婷丁香婷婷| 新激情五月天色播| 欧美六月| 任你搞免费视频观看| 狼人婷婷久久| 婷婷丁香五月欧美人| 婷久久| 大香蕉伊人丁香五月| 夜夜资源站| 五月天黄色激情小说| 色九区| www.ywav| 色色热99| 久久久久久久丁香五月天婷婷| 大地9中文在线观看免费高清| 天天爽天天| 这里只有九九精品| 色五月丁香总合网| 色啪综合| 色色色五月婷| 无毒黄色网址| 成人亚洲精品久久久久| 性综合网| 欧美三级欧美一级| 久色视频| 色综合色综合色综合| 丁香五月激情欧欧美| 欧美日综合| 综合一区二区三区| 色婷婷亚洲在线观看| 五月激情四射网站| 北京熟妇搡BBBB搡BBBB| 婷婷五月色天| 色婷婷综合网站| www.天天干| 日本色色色| 国精产品一区二区三区| 婷婷五月天六月综合| 激情婷婷五月久久| 久久色情| 99热国产| 91九色首页| 成人在线不卡| 激情亚洲婷婷| 久久精品99久久久久久| 婷婷丁香综合| 射琪琪| 97碰人人操| 在线视频你懂得| 操逼巨乳91| 97久久超级| 操啊操av| 97日本操| 少妇人妻凹凸视频| 人妻丰满精品一区二区A片| 丁香五月天无码AV| 99视频精品| 色狠狠色综合久久久绯色AⅤ影视| 久草热视频在线观看| 亚洲天堂婷婷丁香| 熟女五月天久久综合| 久久99热这里只频精品6学生| 午夜成人片400| 97福利视频| 色五月激情五月| 人妻人人操| 日韩丰满少妇无码内射| 97超碰,人人舔,人人操,人人摸| 熟惀91九色在线| 久久婷婷五月综合色丁香花| 亚洲人成网站999综合| 99综合入口| 亚洲熟女乱色综合亚洲网站| AV在线免费播放| 性色人人爽| 欧美激情丁香五月天久久婷婷一区| www婷婷亚洲| 婷婷五月天另类网站| 思思热视频在线观看| 亲子乱AV一区二区三区下载| 五月丁香六月综合激情| 无码成人AAAAA毛片AI换脸| 丁香香蕉射射射| 日韩啪啪自拍| 久久五月激情| tingting五月天亚洲| 亚洲久热无码| 日本久久婷婷| 日本天天操| 99久久婷婷精品视频| 欧美精品A片一区在线观看| 婷婷五月天av| 97色婷婷五月天| 激情五月天综合网| 91超级碰碰碰| 99ri视频在线观看| 久久99综合| 久久综合天天综合| 91精品无码| 丰满少妇猛烈A片免费看观看| 国产高清视频91九九九久久久| 秋霞成人毛片一级A片| 五月丁香六月欧美综合| 九九精品免费| 国产99久久久国产精品免费看| 久久九九热re6这里有精品| 色偷偷色婷婷| 26uuuavcom| 99九九玖玖| 欧美性生交A片免费看| 大香蕉Av在线| 开心五月丁香综合久久| 五夜丁香| 色综合久久88色综合天天人守婷| 成人丁香婷婷五月天| 色婷婷导航| 在线超碰免费| 99热综合在线| 激情五月婷婷视频一区二区三区| 综合网色| 91九色在线视频| 婷婷五月天激情影片| 99热在这里只有精品| 五月婷婷丁香综合,亚洲天堂| 思思热天天看| 丁香五月天之婷婷影院| 伊人综合网站| 日本不卡中文字幕| 伊人AV五月婷| 青青草国产亚洲精品久久| 婷婷中文无码| 第四色婷婷丁香五月| 丁香六月综合激情| 久久人操| 影音先锋91资源站| 任你搞免费视频观看| 亚州激情网| 五月丁香无码| 六月综合婷婷开心伊人| 色综合开心五月深爱五月| 婷婷五月丁香基地| 色老久久| 第五色色色婷婷| 久久久久久久91| 婷婷5月天激情综合| AV在线资源| 色五月婷婷五月天激情综合| 五月丁香激情六月| 丁香五月花| 人妻视频在线| 亚洲中文字幕av| 色综合色| 日韩久久这里只有精品| 欧美va视频| 91伦| 噼里啪啦在线观看免费完整版视频| 中文av网站| ji'qing'luan'ren'lun| 日本操碰碰| 99碰碰碰| 丁香五月av| 97操操操| 欧美婷婷精品激情| 一二三区视频韩国| 99天堂网| 婷婷成人AV| 亚洲AV无码电影| 亚洲黄色影视| 91丨九色丨熟女|新版| 五月丁香六月婷婷的女人| WWW.夜夜操.com| 色婷天天| 东北黄色一级| 久综合4| 狠狠狠狠狠| 日本一级黄色电影| 五月色丁香| 开心五月深爱五月丁香五月激情五月| 99热99思午夜精品| 成人丁香五月| 五月婷在线影院| 九九中文字幕九| 91人妻九色大屁股| 成熟妇人A片免费看网站| 97色婷| 色婷婷19| 天天综合精品| 九九婷婷网五月天| 五月开行婷婷色五月| 九九九成人在线视频| 开心激情色婷婷五月天| 丁香五月性| 91vip在线观看| 六月丁香停| 丁香五月激情网| 婷婷六月久久综合导航| 丁香五月av在线| 26UUU精品一区二区Com| 色婷婷综合五月| 无码天天操| 五月情四婷婷| 96人人操人人操人人| 99re熱| 天天人人综合| 婷婷激情小说网| 婷婷五月丁香五月| 日韩性视频| 久久婷婷热| 五月丁香| 99久久99视频只有精品| 久久婷婷五月天| 五月天色色色| 香蕉久久国产AV一区二区| 九九激情综合| 91碰碰| 五月天激情站| 久久激情综合| 成人欧美一区二区三区在线观看| 综合婷婷六月| 久久综合伊人综合在线| www.com操| 人妻VideOssS人妻| 开心激情网在线| 日韩啊啊啊| 五月丁香花视频| 成人av中文字幕| 丁香五月婷婷啪啪| 日本色婷婷| 麻豆AV一区二区三区| 一级AV片| 男女啪啪做爰高潮无遮挡| 久久午夜理论| 99riAV国产精品视频| 四虎国产精品永久在线国在线| 天天狠狠六月婷丁香影院| 婷婷第六色| 影音先锋 一区| 国产精品第一国产精品| 久热超碰91| 五月丁香九九九综合| 亚洲av免费在线| 日本丰满久久| 嫩草AV久久伊人妇女超级A| 五月婷婷婷丁香播| 翔田千里无码| 激情婷婷丁香五月天小说| 色停停影院五月天| 成人做爰A片免费看视频| 99热| 99久久久国产精品免费蜜乳tv| 亚洲AV成人在线| 婷婷色六月| 国产日产亚洲系列最新| 99久久9| 可以直接看的av| 激情丁香五月激情婷婷| 五月婷婷综合激情| 久久9RE热视频精品98| 日韩人妻AV在线| 99视频精品在线| 97操碰视频| 伊人五月综合网| 我要射综合| 狠狠狠婷婷五月综合| 91操片| 亚洲精品中文字幕成人片| 超碰99热精品在线| 国产人妻人伦精品一区二区| 亚洲成人网站在线观看| 天天射影院| 天天狠天天叉| 丁香五月,激情五月,深爱五月| 国产99精品免费视频| 婷婷色色五月| 九洲一级A片| 婷婷操超碰| 天天操五月天| 色播五月丁香综合| 亚洲无码影音| 国产精品第一国产精品| 激情综合网激情五月天| 噜噜噜狠狠色综合| 五月丁香婷婷导航视频| 九九色欲网| 九九综合九| 五月停亭六月,六月停亭的英语 | 激情九九这里只有精品| 九九99免费视频| www.丁香黄色五月天人与| 99热老司机| www.99热. com这里只有精品| 超碰操网| 久热精彩视频98| 久久五月丁香伊人青草| 天天爽夜夜操| 欧美三级巜人妻互换| 日韩久久色| av中文网站| 亚洲成人网站在线观看| 骚五月婷婷| 欧美色偷偷大香| 玖玖在线视频| 天天爽天天摸天天爱| 性色做爰片在线观看WW| 99热亚洲| 婷婷丁香五月综合| 丁香婷婷色五月激情综合| 大香蕉五月天婷婷| 超碰99在线观看| 成人午夜天| 亚洲综合色婷婷文学| www.久久色.com| 色婷婷先锋| 97干在线| 五月丁香六月婷婷亚洲激情综合| 极品人妻videosss人妻| 色婷婷丁香五月综合| 亚洲婷婷五月天激情| 任你日视频| 婷婷丁香六月天| 国产69精品久久久久999小说| 大香焦啪啪啪| 丁香五月性爱爱五月| 亚洲AV中文在线| 伦乱美欧| 五月天社区狠狠| 神马欧美精| 99热精品在线观看| 欧美成人AAA片一区国产精品| 激情五月综合网| 99九九在线| 婷婷五月丁香欧洲| 精a品a| 色婷婷激情视频| 色五月婷婷DVD| 久久久国产精品黄毛片| 日本熟女视频一区二区| 99在线精品观看99| 五月婷婷亚洲| 超碰在线免费9| 婷婷色五月天色| 美女丁香五婷婷| 69人人操人人爽| 日本激情综合| 日本在线播放97| 丁香五月天激情小说| 无码人妻精品一区二区蜜桃色欲| 五月丁香日本片| 久久精彩视频| 婷婷五月天成人五月天| 天天天天天天操| 久久久久这里都是精品| 99热这里只有精品2| 久久五月网| 亚洲AVDVD| 春色激情第四色| 五月激情网站| 七七婷婷综合| 51成人| 日日日日操| 泰州成人视频| 国产婷婷久久| 天天操天天爽天天爱| 99九九在线视频| 操碰色一区就去操| 六月婷婷激情| 99热这里只有精彩| 国产毛片欧美毛片久久久| 亚洲无码黄色| 激情五月天免费视频| 五月丁香无码| 婷婷五月欧美综合| 亚洲欧洲中文日韩久久AV乱码| www婷婷| 五月综合激情图片| 99热 免费| 综激情网| 在线成人国产| 丁香五月激情月| 日日天天干| 丁香密臀AV激情网| 天天操天天日天天操| 五月婷在线| 亚洲AV成人在线| 激情五月婷婷网| 玖玖爱伊人网| 99热思思在线观看| 97人人干| 婷婷丁香五月91| 色色色色色色色色色色色色色色,网站| 91chinese在线| 玖玖综合色| 91九色国产熟女| 伊人丁香五月婷婷潮吹| 天天橾日日橾夜夜橾17| 国产这里只有精品| 免费观看亚洲AV片| 天天综合 99久久婷婷| 九九热99精品| 五月婷婷激情四月| 丁香婷婷九月在线| xx色综合| 嫩草AV久久伊人妇女超级A| 久热伊人| 色狠狠综合| www久久艹| 色五月婷婷老师| 9久9久| 久久99精品久久只有精品| 久久久久久久91| 天天色天天舔天天爱天天爽| 欧美69久成人做爰视频| 成人欧美一区二区三区在线观看| 日日噜噜夜夜狠狠久久丁香五月| WWW久久久| 婷婷在线免费| 色婷婷av在线观看| 思思热精品在线视频| 96丁香六月婷婷蜜桃综合久久| 激情六月丁香| 夜夜 操无码| www.91色| www.激情.com.| 色优久久| 亚洲 小说 欧美 激情 另类| 国产精品天天狠天天看| 日韩AV色色色| 五月色婷婷夜色|