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

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| 亚洲综合婷婷五月| 久热九九| 182TV亚洲| 五月天婷婷在线视频| 五月婷婷六月丁香在线视频| 婷婷五月激情视频网| 黄网免费观看| 婷婷五月大香蕉| 草草操操| 狠狠干激情五月| 五月色综合| 九色视频入口91| 99热欧美| 开心五月婷婷激情网| 激情五月黄色| 99乱视频| 26UUU亚洲欧美| 五月开心久久| 开心五月激情| 天天想夜夜爽天天爽| 激情五月,激情综合网| 色婷婷色五月天| 亚洲春色奇米影视| 丁香五月天之婷婷影院| 操碰99| 99re免费精品视频| 人人色人人摸人人看| 欧美黄色一级录像| 色老久久| 九九视频精品在线免费| 丁香桃色网| 五月天丁香婷| 伊大人久久| 99人妻碰碰碰久久久久视| 九九热10| 国产精品激情AV久久久青桔| 狠狠综合| 五月花免费视频| 婷婷五月天黄色| 五月天婷婷激情| 伊人婷婷五月| 丁香激情五月| 丁香色五月天| 99热网站| 99re热在线视频观看| 激情小说五月天| 六月天六月婷| 9这里只有精品| 日韩黄色网络| 91婷婷五月丁香碰| 亚洲国产精品VA在线看黑人| 日日操,夜夜撸| 欧在线一区| 思思热在线| 丁香五月开心五月激情| 欧洲一区二区| 五月天激情黄色网址| 亚洲欧美国产高清vA在线播放| 操日视频| 99re热精品在线视频| 91午夜婷婷狠狠久久综合9色| 九九无码| 婷婷六月综合| 夫妻超碰在线| 久久综合综合综合| 日B日潘金莲BB| 99热精品中文字幕| 思思热在线| 91大屁股| 日本综合色图| 97五月天婷婷综合激情网| 久久婷婷综合五月天| 天天天操天天天日| 欧美色图45678| 26uuu精品国产| 99ER热精品视频| 丁香五月婷婷色情综合| 亚洲小视频免费看| www,com,五月色色| 噜噜视频| 婷婷激情视频| 亚洲成人av在线播放| 亚洲激情丁香五月天色| 猫咪伊人AV| 一起草Av| 九九九激情网| 五月天偷拍| AV成人在线播放| 久久久99精品免费观看| 五月丁香综合激情在线观看| 淫五月停停| 99热久| 日本美女五月天| 91碰碰视频在线观看| 99re这里| 久久性爱视频| 狠狠色色| 婷婷丁香91综合| 99视频自拍| 亚洲精品成人| 开心婷婷中文字幕| 五月天婷婷激情小说电影| 五月天激情Av| 激情综合色五月丁香六月亚洲| www,8050,午夜三级| 欧美在线ee日韩| 666555。COm毛片| 色综合九九| 天天色天天操天天射| 色婷婷电影| 91久久久久久久91| 久久九九中文字幕| 亚洲AV成人片无码网站| 另类五月婷婷| 啪到高潮激情丁香五月| 久久久日韩特色特黄AAAA| 久草五月婷婷| www.minyis.com【JT】实力收量可预付QQ2101460746 | 亚洲第一色区| 99热在线观看免费| 99精品在| 丁香五月激情五月| 中文在线成人| 永久无码色| 激情五月婷婷丁香六月| 色色色色av777| 精品怡红九九九| 五月婷久久在线| 99视频久久免费视频| 成人看片网站| 亚洲成人网在线观看| 丁香九月婷婷| 久久久久久欧美精品se一二三四| 久久婷婷五月天蜜桃| 精品人妻一区二区| 开心激情综合| 激情五月丁香五月色| 九九激情网| 婷婷五月天狠狠搞干| 丁香六月激情综合网| 激情狠狠丁香月| 新伍月婷婷| 日韩欧美骚货| 超碰91在线| 久久9视频| se色婷婷视频| 久久色婷婷| 激情婷婷五月天。| 九九这里都是精品| 九九这里有精品| 深爱五月天天| 色婷婷丁香五月天在线视频| 26uuu国产精品| 26UUU精品一区二区Com| 亚洲日日日| 丁香五月婷婷啪| 天天肏天天肏天天肏| 无码激情| 日韩无码色色| 丁香婷婷九月在线| 天搞天天天天天| 久久久精品人妻| 婷婷色影音天| 久大香蕉| 79色色| 色婷婷亚洲婷婷| 99热综合| 久久最新色| 五丁香激情综合| 欧美色色色色色色色色色色| 无码人妻少妇色欲AV一区二区| 国产精品 的国产| 激情五月天综合图片小说网站| 十月色综合| 欧洲色| 99在线资源| 色99热| 少妇人妻人伦A片| 色v综合网| 五月天婷婷黄色| 久久99久久99精品免观看粉嫩| 青柠影视免费高清电视剧| 亚洲中文字幕AV| 五月天综合影院| 亚洲激情无码久久| 丁香五月婷婷色| 97日本操| 色五月婷婷DVD| 99九无网码| 五月婷天堂视频| 综合热无码| 99色综合| 亚洲五月综合色播| 综合aV在线| 五月天色婷婷av| 99视频只有精品| 大香蕉啪啪| 天天搞天天色综合| 婷婷久久久久| 丁香五月婷婷啪啪啪| 97色啪| www夜夜| WWW色五月| 青青草婷婷综合五月| 色九九综合色| 婷婷色五月天综合网| 五月激情丁香六月狠狠干| 亚洲色9| 这里只有精品免费视频| 天天爱天天做天天舔| 婷婷大香焦| 九九久久偷拍| 五月天婷婷爱| 色播五月综合网| 丁香五月五月婷婷| 99九九在线| 九九热re99re6在线精品| 黄色毛片精品| 1024人妻| 99热这里只有精品10| 可以免费观看的av| 色八月婷婷| 激婷网| 五月婷婷69| 丁香五月婷婷基地| 五月色婷婷中文字幕| www久久久久| 久热精品视频| anquye伊人| 欧美五月婷婷综合| 色色色色网| 五月丁香花激情啪啪网| 一区二区三区XXXXXX| 99爱视频| 成人AV在线网站| 东北熟女高潮99综合99| 99热在线精品观看| 婷婷五月天综合小说网| 26uuu美女三级视频| 淫视馆av三区| 亚洲无码九九| 色色色区| 欧美性生交XXXXX无码小说| 小视频一区 | 99亚洲精品视频| 日韩黄黄| 艹天天射| 成人国产欧美大片一区| 五月天激情网图片| 99re久热只有精品6在线直播| 超碰在线观看三级片| 五月婷婷在线播放| AA片在线观看视频在线播放 | 色噜噜狠狠色综合网| 丁香五月激情婷婷婷婷在线观看| 色色五月婷婷久久| 婷婷五月天av| 婷婷性爱网| 都市激情小说婷婷| 天天人人天天爽| 色婷婷伊人| 伊人喵咪a V| 天天干人人奸97| 超碰亚洲天堂| 熟女激情五月天 | 丁香婷婷久久老熟女综合网| 99精品这里只有免费视频| 播四月婷婷六月丁香| 情色五月天网站| 婷婷丁香九色| 夜夜爽天天爽| 婷婷色六月| 日日干日日色| 久久99久久99精品免观看粉嫩| 91人人人人人人人| 欧美黑人巨大性生话| 五月天成人在线视频网站| 狠狠五月激情在线| 久久久五月婷婷| 无码激情AAAAA片-区区| 色色99| 天天操天天曰| 激情5月天天天| 伊人五月天综合网| 99热9| 天天日天天草| 91碰碰视频| 在线,国产,色,热视频| 婷婷五月丁香久久| 天天摸色吧天天摸色吧| 综合激情站| 久久9视频欧美| 婷婷五月激情中文字幕| 成人精品在线观看| 成人丁香婷婷| 日韩情色在线观看| 另类图片激情五月| 79精品视频在线观看,| 婷婷丁香成人五月天| 亚洲狠狠操| 99热精品综合| 丁香五月激情在线| 久久9精品视频| 秋霞三及片| 91精品久久久久久久| 操比激情五月| 99热这里都是精品| 就99这里只有精品| 婷婷六月婷婷| 超碰精品手机在线| 热这里| 思思99精品视频在线观看| 青青操avbb| 成人五月天综合网| 国产 码在线成人网站| 欧美人与性动交CCOO| AA片在线观看视频在线播放| 婷婷色五月婷| 人人草人| 深爱激情五月天| 人人视频色| 丁香五月亚综合图片| 激情熟女网| 啪啪六月婷婷| 日日干夜夜撸夜夜骑| 六月丁香激情| 中文字幕 中文字幕明步| 欧爱综合视频| 久久人人九九| 日本三级99人妇网站| av第一二区| 丁香五月天欧美在线| 噜噜久| 免费V片在线| 色丁香五月天| 超碰妻人人| 丁香色六月| 丁香六月综合激情| 综合激情网| 五月天婷婷色播在线网| 国语精品探花| 亚洲成人五月天| 婷婷亚洲天堂| 影音先锋男人av资源站| 九九热在线99| 99国产er热视频| 人妻射精AV| 久热这里只有精品在线观看| 婷婷五月天黄色小说| 男女99免费视频| 亚洲无AV在线中文字幕| 97碰免费视频在线| 天堂成人A片永久免费网站| 97国产精品女人碰碰| 国产偷人爽久久久久久老妇APP| 国产视频色色色色色色色| 欧洲色| 综合网色综合| www.俺去也com| 噜噜视频| 97热视频| 色五月天堂| 丁香五月婷婷影视先锋| 五月夜丁香| 久99在线视频| 亚洲无码www| 南京搡BBBB搡BBBB| 婷婷精品视频| 九九热视频精品2| 精品久久人妻| 色婷婷影院| 五月婷婷六月丁香五月| 日日操天天爽| 久久久精品人妻| 26uuu日韩| 亚洲九九99精品视频在线播放| 日韩无码系列| 久久丁香五月婷婷激情综合网| 9久热这里只有精品| 亚洲六月色婷婷| 六月丁丁香| 91精品综合久久久五月天| 黄网网站在线播放| 天天干天天操| 色婷婷丁香五月| 激情综合六月| 性爱久久| 亚洲mm色| 99操网站| 人人草人人舔| 91丨九色丨熟女| 六月婷婷综合| 婷婷欧美激情综合| 婷婷五月天狠狠搞干| 丁香婷婷久久 | 国产激情综合| 欧美123区免| 丁香五月香蕉在线| 欧美综合123区| 色视频色综合91| 丁香五月日韩| 激情六月天婷婷| WWW.五月com| 色婷婷丁香五月天| 五月婷婷色播| 久久33视频| 五月婷婷伦理| 丁香六月婷婷综合| www.激情五月天。com| 99ri国产| 黄色片精品| 色性五月天| 99视频在线| 91精产一区三区免费观看| 人妻激情综合| 国产一级黄色影片,| 精品思思久久| 日韩成人无码人妻| 婷婷五月色图| 色色婷婷丁香五月天| 99热在线极品极品| 六月丁香婷婷色69| 少妇人妻丰满做爰XXX| 蜜桃婷婷丁香五月天狠狠久久综合| 精品人妻在线| 日韩日比视频| 国产精品电影网| 色五月美女| 婷婷免费无视频| 色九四色| 日韩精品无码99| 精品婷婷丁香五| 91操操操| 亚洲午夜在线视频| 天天干天天 亚洲| 久9综合| 丁香五月六月婷婷自拍| 搡BBBB搡BBB搡18| 九九综合视频在线观看| 97综合在线| 三级三久久线久久99久目本WW| 天天日天天插| 97婷婷丁香五月天激情图片| 丁香六月婷婷综合缴| 亚州第一黄网| 直接看的AV| 九九热精品99| 99久久婷| 天天爽天天爽天天爽天天爽天天爽天天爽天天| 色色国产| 激情综合网址| 色色色综合网| 欧美精品久久久久久视频观看| 人妻内射视频| 日本女va| 色五月婷婷在线观看第一页舔| 97色色色色色| 大香蕉久热| 香蕉狠狠爱视频| 九月丁香久久网| 香蕉AV777XXX色综合一区| 97干婷婷五月天| 亚洲亚洲人成综合网络| 五月天婷婷丁香视频| 黄桃AV无码免费一区二区三区| 亚洲va在线∨a天堂va欧美va| 玖玖综合玖玖| 亚洲综合1024| 色色色99韩| 思思久久99热只有频精品66| 亚洲AV成人无码久久精品老人法拉利| 婷婷五月精品中文| 日韩人妻无码专区| 五月情四婷婷| 五月四色激情| 久久六月天| 六月丁香婷婷综合色播| 五月激情四射网站| 五月婷激情| 丁香六月亚洲| 久久婷婷五| 精品久久99码| 婷婷色婷婷| 玖玖爱伊人| 天天操夜夜玩!| 五月天婷婷色色| 五月婷婷激情网| 九热免费视频| 人妻丰满精品一区二区A片| 五月天婷婷丁香蜜桃91| 久久精品噜噜噜成人A∨色欲| 99精品一二三四视频| 综合玖玖性爱免费视频| 精品久久久中文字幕大豆网推荐理由| 欧美色婷婷| 超碰碰碰碰| 国产欧美日韩综合精品一区二区| 五月婷婷开心网| 久久亚洲婷婷| 婷婷婷五月香蕉| 91青娱乐青青草| 激情播丁香| 综合久久首页| 久久曰曰| 亚洲视色| 97干欧美| 91色综合网站在线| 99亚洲精品视频| 天天夜天天色天天| www.色婷婷| 五月婷婷性爱网| 久久综合爱| 亚洲五月天婷婷综合| 超碰在线中文字幕| 色五月丁香com| ww久久| 伊人五月天婷婷| 久综合网| 成人网页在线观看| 91久久日日| 99久在线精品99re8| 99综合激情久久精品久久| 超碰人人艹| 丰滿爆乳一区二区三区| 免看黄大片AA | 碰碰女| 亚洲免费99| ww亚洲ww在线观看| 久热丁香| 午夜成人片400| 色屌丝中文字幕| 深爱五月天婷综合| 淫视馆AV在线| 9九九久久精品无码专区| 日韩成人免费电影| 天天草比天天爽| 青青热久久综合| 99久在线精品99re5热视频| 97在线精品| 婷婷色色欧美| 99网址在线观看| 丁香色婷婷| 国产日韩欧美| 五月天天天开心激情网| 激情综合九月| 亚洲婷婷综合视频| 丁香五月亚洲综合丝袜| 婷婷五月影院| 日韩超碰在线| 夜夜骑夜夜操| 天天摸日日舔狠狠添婷婷婷| 另类图片天天影视在线观看| 婷婷五月a| 国产AV成人精品| 激情五月天婷婷| 五月情色天| 99久久66| 六月婷婷网| 99色久| 欧美性猛交 XXXX 乱大交| 97色在线视频| 久久精品婷婷| 五月成人网站| 老美AA片| 99热综合网| 丁香婷婷色五月| 五月的婷婷六月丁香| 殴美97色| 欧美精品啪啪| 影音先锋五月婷婷| 色九月综合| 色婷婷成人做爰A片免费看网站| 俺去也五月天婷婷| 国产精品视频免费看| 久久婷婷伊人| 五月婷婷av| 国产精品久久久久久喷浆| 成年视频免费观看| 五月天色综合| 99久久精品亚洲综合| 九色视频九色九色91jiuseshipin| 五月婷婷色色| 99热这里是精品| 婷婷婷久久久| 亚洲五月天色色| AV人人操| 久久久精品人妻| 大地资源色婷婷视频在线| 囯产精品一品二区三区| 天天色天天爽| 全网最新网黄大秀直播高清,主播国产录屏在线 | www.久久| 亚洲成人在线播放| 中文人妻AV久久人妻18| 欧洲亚洲精品| 亚洲综合五月天| 国产亚洲在线| 成人片在线播放| 丁香久久| 4399无码视频| 久久爱综合| 色99最新网址| 97碰碰视频| 成年视频免费观看| 五月婷婷网久久| 天天色,天天操,天天射| 丁香五月激情性色郤| 五月天影院| 丁香五月婷婷色| 婷婷八月丁香激情综合| 99色在线观看视频| 五月婷性爱| 国产一级黄色影片,| 精品久久久91久久影视网| 99久久喉9| 欧美三级视频| 大香蕉五月丁香| 丁香六月开心| 六月狠狠综合| 久超超碰| 婷婷五月天亚洲综合| 超碰在线成人| 婷婷午夜| 色999五月色| 久草婷妨| 中文字幕,综合,91| 五月天激情国产综合AV| 婷婷五月图片小说网| 婷婷五月天激情电影小说| 欧洲毛片基地c区| 欧美色婷婷| 香蕉久操| 色播播婷婷| 99免费成人网| 99热官网| 欧类av怡春院| 操逼福利视频| 婷婷99中文字幕| 日韩无码91| 人妻精品久久久久久| 丁香六月天AV| 久久五月天免费网站| 五月天黄色激情小说| 1024欧美看片| 五月天色婷婷伊人网| 夜夜资源站| 六月婷婷狠狠色在线观看| 激情五月亚洲综合网| 亚洲第一第二网站| 99热在线观看| 国内久久婷婷| 99热香港| 91色涩| 成人综合网站| 婷婷99中文字幕| 激情婷婷亚洲五月| 丁香五月电影| 丁香五月亚洲AV| 五月情四婷婷| 99免费| 天堂久久久久天堂网| 婷婷五月色| 人妻丰满精品一区二区A片| 干亚洲天堂| 丁香五月成人社区| 成人精品视频99在线观看免费 | 婷婷色导航| 国产精品涩涩涩视频网站| 99在线视频免费| 色婷婷欧美在线| 丁香五月婷婷基地| 国产婷婷五月| 狠狠五月天激情| 另类图片五月天| 91狠狠色| 色99热| 一本色道久久综合狠狠躁小说| 精品久热| 亚洲综合网 665566| aV欲望人妻中文字幕| 九九热这里只有精品556| 丁香五月天堂网| 久久综合55| 69午夜成人影片| 日本五月婷婷| 婷婷五月综合网激情| 国产xxxxx在线观看| 五月婷婷中文字幕| 婷婷色色丁香| 色播五月| 色网站9| www.色婷婷。com| 六月丁香五月婷婷| 色色色欧美| 五月天亚洲综合网| 超碰国产在线观看| 色综合天天| 日本久久激情| 影音先锋人妻出差| 99riav 亚洲| 99热都是精品| 婷婷爱五月| 五月丁香成人| 99re热视频这里只有综合亚洲| 开心色播色五月婷婷| 女人高潮内射99精品| 天天色,天天日,天天做| www99xxxx五月丁| 色99日韩| 丁香五月停停av| 久久这里只有精品热在99| 少妇AB又爽又紧无码网站| 婷婷丁香综合成人| 久久99视频| 婷婷五月天开心网| 天天操天天爱天天玩| 97色色婷婷| 96人人操人人操人人| 无码99| 色日本丁香婷婷| 日韩国产在线精品| 天天舔天天摸视频| 色综合久久综合| 琪琪色五月天| 很很操96| 蜜乳久AV| 天天色99| 综合综合网| 六月婷欧美| 丁香婷婷激情四射五月| 九九视频精品在线免费 | 色播婷婷五月天| 人人色婷婷| 婷婷五月天,影院| 国产在线aaa片一区二区99| 丁香六月婷婷综合| 啪啪啪综合网| 国产亚洲色婷婷久久99精品91| 五月丁香啪啪啪啪| 丁香五月综合激情久久潮喷| 先锋资源91| 日韩一级片| 色99视频| 久久久久久丁香五月| 色日本综合| 久久激情网| 第四色色六月色综合| 高潮毛片遮挡费高一百度| 天天日综合| 九九这里精品| 日韩有码一区| 国产在线激情视频| 99精品久久久久| 日本99视频| 九九9久九9国产视频| 五月激情小说| 天天人人天天爽| 婷婷丁香大香蕉| 91一起操| 色婷婷色五月综合| 色婷婷色综合激情91| 麻豆忘忧草午夜| 97在线观看| 69色婷婷| 白天AV月月| 婷婷丁香综合| 91无码一区人妻A片蜜| 99九九在线观看免费| 久久综合中文| AV大片在线播放| 丁香色婷婷| jiujiu无码五区| VA婷婷| 五月丁香婷婷老司机| 五月丁香婷婷六月| 色播激情五月天| 久久香蕉网| 91xxxx九色| 亚洲第一综合| 天天搡日日搡aaaaⅩ| 99 这里只有精品| 日本久久爽| 婷婷五月天在线观看| 成人丁香婷婷五月天| 五月天成人在线| 超碰成人在线观看| 国产特黄色精品一区二区三区精品无广告| 深爱婷婷网| 综合综合网| 天天日日人| 久久只有精品| 桃色激情五月天| 激情婷婷护士激情| 四色永久成人网站| 操日视频| 中文av网站| 五月婷婷久久综合| 欧美天天爽| 中文资源在线a | 久久综合五月天激情小说网站 | 99啪啪| 五月丁香六月婷婷激情网| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 操大屄五月天视频| 亚洲成人网在线观看| 婷婷十月丁香| 国产精品久久久久久五月天加勒比| 五月丁香久久呀| 六月丁香成人| 九九成人电影婷婷| 天天操天天插| 五月丁香六月激情综合| 色色色婷婷五月天| 超碰国产AV| 天天插,天天射| 久热这里只有精品在线| 秋霞三级影视资源| 91精品久久久久久77777| 丁香五月婷婷激情中文| 天天综合区| 一本色道久久综合狠狠躁一二三 | 成人va在线播放| www.99热这里精品| 丁香六月色婷婷综合| 亚洲五月六丁香激情| 色色99色色| 99热99干| 久久这里只有精品无码| 色五月五月丁香| 亚洲激情丁香五月天色| 五月婷婷伦理| 丁香丁婷五月激情| WWW.天天日| 婷婷四色成人综合色视| www 五月天 com| 久久狠狠色| 这里只有精品99视频| wuyuedingxiang99| 婷婷色激情网| 99热只有精品综合| 99超在线| 美国十月色婷婷在线观看| 女人被男人吃奶到高潮| 99国产精品久久久久久久久久久| 日韩九区| 五月丁香狠狠爱| 九九热re99re6在线精品| 91精品91久久久中77777| 俺去也五月天婷婷| www.婷婷| 狠狠精品干练久久久无码中文字幕| 激情小说五月天| 亚洲五月天激情| 熟女人妻视频| 狠狠色婷| xxxx五月激情| 婷婷久久六月天| 五月婷婷亞洲中文| 天天影视天天爽天天草| 超碰99热| 五月天激情小说网| 色欧美色色色| 久草丁香婷婷1024| jiujiu热在线视频| 五月婷色丁香| 久久婷婷亚洲| 国产精品a无线| 精品五月花| 国内裸舞二区| 五月婷六月| 日韩另类| 亚州男人天堂婷婷五月| 欧美日韩中国| 99re在线视频精品,这里只有精品18,| 色婷婷精品小视频| 五月天最新网| 色色网站| 激情AV网| 日本女人久久| 久久五月天激情美女| 婷婷丁香五月天在线| 色婷婷www| 91色五月| 天堂网色色| 伊人婷婷五月天| 99色看| 五月婷婷综合在线| 粉嫩AV久久一区二区三区| 2022久久婷婷| AV在线免费播放| 欧美精品18| 色婷婷久久| 无码se| AV在线免费播放| 欧美激情久| 亚艹艹| 91久女| 香蕉久久国产AV一区二区| 操一操| 亚洲成人网站在线观看| 五月婷婷性爱网| 日韩无码性爱| 九月婷婷综合| 99久热这里只有精品| 色情综合网| 伊九九三级区| 97 A I色色| 中文中文在线| www、丁香五月天| 婷婷欧美偷拍综合| 五月婷婷av| 另类亚洲电影| 热久久77777| www.99热精品| 国产成人精品一区二三区熟女在线| 免费色婷婷| 久久丁香五月婷| 五月天激情国产综合婷婷婷 | 丁香激情合作五月| 中文久久婷婷| 97干在线免费| 五月综合在线婷婷图片| 99只有精品| 涩丁香| 婷婷激情综合无月| 人妻精品在线| 色亭亭九月| 狠狠xx| 亚洲婷婷五月| 激情五月com| 六月 丁香 视频| 91色在线 | 日韩| 色五月色五天色情网| 婷婷免费视频| 超碰在线9| 婷婷五月久久| 欧美在线| 五月婷婷五月丁香综合| 久久hd| 亚州第一黄网| 九九成年视频| 噜噜在线| 操逼五月天| 婷婷5月开心6月| 强壮公让我夜夜高潮A片视频| 国产AV不卡福利| 婷婷天天婷婷天天澡| 开心激情站| 色情·com| 九九热这里只有精品9| 操人妻90p| 午夜大香蕉| 婷婷成人AV| 五月天色五月| 97精品综合久久| 婷婷久久综合久色| 国产毛多水多女人A片| 激情五月天在线| 99热日韩| 午夜九九电影| 噜噜噜狠狠色综合| 亚色网站小视频| 成片免费观看视频大全| 亚州精品色情无码A片| 亚洲偷| 五月开心婷婷| 亚洲 精品 综合 精品| 99这里只有精品国产| 99视频内射三四| 99国产精品久久久久久久久久久| 久久五月天婷婷| 色五月综合| 久久大香免费| 婷婷五月天网| 亚洲第二AV| 强伦轩人妻一区二区电影| 日日激情网| 国产va在线视频| 热99.com婷婷| 另类婷婷丁香| 思思热视频| 天天综合区| 色婷婷色久综| 六月婷婷激情| 久久久久久久丁香五月天婷婷| 超碰国产在线观看| 91chinese在线| 五月丁香久人妻中文| 免费无码毛片一区二区A片| 99无码精品| 99热成人在线观看| 丁香五月另类小说在线阅读| 亚洲婷婷综合视频| 色婷婷av在线| 久久激情天堂| 精品99*| 丁香五月天激情综合| 婷婷无码五月天| 五月婷婷,六月激情| 26uuu美女三级视频| 久久91久久91色欲精品| 婷婷五月天国产传媒| 337p大胆噜噜噜噜噜91Av| 99久热视频在线| 99∨VTV| 久久99网站| 99热亚洲| 狠狠丁香| www.91在线观看| 婷婷五月天播播| 亚洲综合新99视频| 97激情五月天| 精品九九网| 久久婷婷视频| 五月天啪啪| 亚洲激情综合五月婷婷啪啪| 国产毛片精品一区二区色欲黄A片| 色狠狠999综合| 婷婷色播色五月五色五月天色妇| 在线观看国产高清视频免费网站 | 欧美在线视频99| 激情五月天之六月婷婷| 激情综合色五月丁香| 久久婷婷五月综合色丁香| 97中文在线| 欧美色激情四射| 丁香婷婷九月| 99re在线观看视频| 欧美日韩国产一区二区| 亚洲成人日韩无码精品| enecarbon-materials.com污K127封锁请涟系@wip1688 | 伊人丁香在线| 亚州操操| 国产精品色色| 亚洲va在线∨a天堂va欧美va| 天天夜天天色天天| 97久操| 五月丁香综合| 涩五月色婷婷| 天堂爱爱| 99热99操| 爽tv | 少妇性按摩无码中文A片| 99久在线精品99re8| 狠狠第四色| 久久久全国免费视频| 五月久久婷婷| 婷婷色色欧美| 天天爽天天弄| 丁香六月婷婷高清| www激情网站| 九九色天堂| 久久久精品99| 久青草影院| 天天干-天天日| 91操色| 六月丁香大香蕉| 麻豆AV一区二区三区| 日本九九视频| 五月婷婷人妻| 久青青久| 国产av基地| 婷婷伊人綜合中文| 色综合五月天| 亚洲操b| 99热手机在线精品| 九九亚洲| 九九在线视频| 久久激情五月天| 狠狠艹狠狠艹| 九月婷婷综合| 综合激情sV| 九九九九中文字幕| 2018夜夜草| 久草热8精品视频在线观看| 九九re视频在线视频| 99er6免费视频热播| 日本婷婷综合精品| 色播五月婷婷| 亚洲综合在线播放| 日韩五月丁香| 免费精品66| 色噜噜狠狠色综| 五月婷婷开心激情六月蜜桃| 婷婷的99视频网站| 欧美图片丁香五月天| 一本色道久久综合狠狠躁一二三| 日本色色色| 综合99久久天天综合| 日日夜夜小色哥| 丁香五月六月婷婷综合| 天天爽,夜夜爽| www.91操| 玖玖99免费视频| 色导航色婷婷五月天在线观看| 日韩在线99| 婷婷丁香色无五月| 极品五月天| 欧美性猛交99久久久久99按摩| av九九| 超碰九热| 亚洲网在线观看| 丰满少妇猛烈A片免费看观看| 人妻中文av| 北条麻妃九九九国产精品视频| 欧美激情综合五月色丁香| 丝袜大香蕉| 97色色网| 99热久| 亚洲色综合| 婷婷丁香色五月| 九九热黄色| 激情五月综合亚洲另类| 99精品视频网站| 天天做夜夜爽| 九九热99热| 丁香五月桃花在线激情综合| 色综合综合综合| 强辱丰满人妻HD中文字幕| 久久五月天影院| 五月婷A V在线| 婷色五月天| 99碰网站| 天天肏屄夜夜爽| 欧美一级操逼视频| www色中色综合| www,天天干| 五月天com| 五月激情综合网| 91操网| 丁香五月婷婷六月丁香| 亚洲婷婷五月| 成人网站在线观看视频| 无码少妇高潮喷水A片免费| 熟女少妇内射日韩亚洲| 婷婷爱爱蜜臀天天操| 99精彩视频在线观看| 十月丁香九月婷婷综合| 俺也去婷婷五月天第五色| 99无码| 97视频.干com| 日在线V视频在线播放| 五月网激情| 色丁香综合影院| 久久精品视频9| 色亚洲激情| 五月天色丁香| 日本综合久久| 99精品网| 丁香五月婷婷亚洲天堂| 亚洲午夜国产成人电影VA国产欧…| 9色91视频| 激情图片久久| 4399成人黄A片| 婷婷五月天熟妇| 99久视频| 五月天婷婷Av| 丁香婷婷免费| 五月永久激情| 五月婷婷深深爱| 亚洲九九99精品视频在线播放| 色噜噜狠狠色综合网| 天天色综网| 天堂伊人干| 美女xx不卡| 97操视频| 丁香五月在线观看完整版| 久久99久久99精品免观看粉嫩| 超碰在线中文字幕| 国产又爽又猛又粗的视频A片| 人人操碰| 色五月丁香五月| 天天日夜夜操五月| 婷婷综合视频| 久久5 9视频免费观看| 丁香五月WWW| 97色色色视屏| 日本婷色| 五月丁香久久| 亚洲色人妻| 森林影视大全,最好看的2019年视频 | 五月综合六月丁| 久久婷婷内射| 夜夜躁爽日日| 99色热| 日本人人xxx| 99ri视频| 五月丁香婷婷啪啪综合| 色优久久| 天天日天天草| 香蕉久久国产AV一区二区 | 日本人妻A片成人免费看片| 天天插天天插| 五月色婷婷影院| 色九亚洲| 婷婷六月丁香五月| 99超级碰碰| 插插插丁香五月婷婷| 99九九精品| 久久综合99综合| 久久婷婷丁香| 思思热久热| 亚洲亚洲人成综合网络| 天堂AV三级| 奇米色大香蕉| 精品成人久久久久久久_一二三四视| 欧美天天综合网站上去吧| 久久久激情视频| 伊人99久久| 色五月天丁香| 欧美日韩成人高清在线| 99国产精品白浆在线观看免费| 激情九月综合| 五月婷婷六月丁香五月| 少妇大叫太大太粗太爽了A片| www 五月天 com| 九九激情综合| txt五月激情四射网综合俺也来了| 久久午夜理论| 五月丁香综合网| 久久92| 99性爱视频| 日韩精品AV一区二区三区| 99热这里只有精品50| 色色国产| 色色综合五月| 夜夜爽天操| 夜夜嗨一区二区三区直播内容 | 国产成人av在线| 情涩婷婷五月天| 少妇人妻偷人精品无码视频新浪| 五月的丁香六月的婷婷| 99热这| 久久综合综合久久| 丁香五月激情婷婷婷婷在线观看| se色婷婷视频| 激情综合激情五月| 亚洲99一级无嗎特制在线| 色色色99| 婷婷五月无码| 九九国产精视频| 狠狠色婷婷| 国产无人区大片| 人妻久久人妻久久第一区| 91/九色黑人| 国产精品蜜臀99| 日韩av变天就操逼不卡区| 丁香六月色婷婷欧美| 成人va在线播放| 久久机热这里只有精品免费视频| 97五月天| 97天堂| 久久视频婷婷视频| 玖玖在线视频福利| 日本婷婷| 久久亚洲天堂| 激情床戏| 91凹凸在线| 99热这里只有精品青草| 99热天堂| 九色91国产| h亚洲| 丰满少妇乱A片无码| 99精品在线|