"以下是使用Qt6 Qoppa PDF Studio Viewer的示例:\n\n1. 导入必要的模块和类:\n\ncpp\n#include <QApplication>\n#include <QVBoxLayout>\n#include <QWidget>\n#include <QLabel>\n#include <QFileDialog>\n#include <QMessageBox>\n#include <QPrinter>\n#include <QPrintDialog>\n#include <QPainter>\n#include <QMouseEvent>\n#include <QWheelEvent>\n#include <QScrollBar>\n#include <QTimer>\n\n#include \"pdfviewerwidget.h\"\n\n\n2. 创建一个自定义的PDF查看器窗口类,并继承自QWidget:\n\ncpp\nclass PDFViewerWindow : public QWidget\n{\n Q_OBJECT\n\npublic:\n explicit PDFViewerWindow(QWidget *parent = nullptr);\n\nprivate slots:\n void openPDF();\n void printPDF();\n\nprivate:\n QVBoxLayout *m_layout;\n QLabel *m_pageLabel;\n PdfViewerWidget *m_pdfViewer;\n};\n\n\n3. 在构造函数中初始化界面和信号槽连接:\n\ncpp\nPDFViewerWindow::PDFViewerWindow(QWidget *parent) : QWidget(parent)\n{\n m_layout = new QVBoxLayout(this);\n m_pageLabel = new QLabel(this);\n m_pdfViewer = new PdfViewerWidget(this);\n\n m_layout->addWidget(m_pageLabel);\n m_layout->addWidget(m_pdfViewer);\n\n connect(m_pdfViewer, &PdfViewerWidget::currentPageChanged, this, [this](int page) {\n m_pageLabel->setText(QString("Page %1").arg(page));\n });\n\n QPushButton *openButton = new QPushButton("Open PDF", this);\n connect(openButton, &QPushButton::clicked, this, &PDFViewerWindow::openPDF);\n m_layout->addWidget(openButton);\n\n QPushButton *printButton = new QPushButton("Print PDF", this);\n connect(printButton, &QPushButton::clicked, this, &PDFViewerWindow::printPDF);\n m_layout->addWidget(printButton);\n\n setLayout(m_layout);\n}\n\n\n4. 实现打开PDF文件的槽函数:\n\ncpp\nvoid PDFViewerWindow::openPDF()\n{\n QString filePath = QFileDialog::getOpenFileName(this, "Open PDF File", QString(), "PDF Files (*.pdf)");\n\n if (!filePath.isEmpty())\n {\n if (m_pdfViewer->loadPdf(filePath))\n {\n m_pageLabel->setText(QString("Page %1").arg(m_pdfViewer->currentPage()));\n }\n else\n {\n QMessageBox::critical(this, "Error", "Failed to open PDF file.");\n }\n }\n}\n\n\n5. 实现打印PDF文件的槽函数:\n\ncpp\nvoid PDFViewerWindow::printPDF()\n{\n QPrinter printer(QPrinter::HighResolution);\n QPrintDialog printDialog(&printer, this);\n\n if (printDialog.exec() == QDialog::Accepted)\n {\n QPainter painter(&printer);\n painter.setRenderHint(QPainter::Antialiasing);\n QRect rect = painter.viewport();\n QSize size = m_pdfViewer->getPdfPage(m_pdfViewer->currentPage())->pageSize();\n size.scale(rect.size(), Qt::KeepAspectRatio);\n painter.setViewport(rect.x(), rect.y(), size.width(), size.height());\n painter.setWindow(m_pdfViewer->getPdfPage(m_pdfViewer->currentPage())->pageSize());\n m_pdfViewer->getPdfPage(m_pdfViewer->currentPage())->renderToPainter(&painter);\n }\n}\n\n\n6. 创建一个PdfViewerWidget类来显示PDF文件:\n\ncpp\nclass PdfViewerWidget : public QWidget\n{\n Q_OBJECT\n\npublic:\n explicit PdfViewerWidget(QWidget *parent = nullptr);\n\n bool loadPdf(const QString &filePath);\n int currentPage() const;\n PdfPage *getPdfPage(int pageIndex) const;\n\nsignals:\n void currentPageChanged(int page);\n\nprotected:\n void paintEvent(QPaintEvent *event) override;\n void mousePressEvent(QMouseEvent *event) override;\n void mouseMoveEvent(QMouseEvent *event) override;\n void wheelEvent(QWheelEvent *event) override;\n void resizeEvent(QResizeEvent *event) override;\n\nprivate:\n void updateScrollBar();\n\n QString m_filePath;\n QList<PdfPage *> m_pdfPages;\n int m_currentPage;\n double m_scale;\n double m_minScale;\n double m_maxScale;\n QPoint m_lastPos;\n bool m_isDragging;\n QScrollBar *m_scrollBar;\n};\n\n\n7. 实现PdfViewerWidget类的构造函数和相关函数:\n\ncpp\nPdfViewerWidget::PdfViewerWidget(QWidget *parent) : QWidget(parent)\n{\n m_filePath = "";\n m_currentPage = 0;\n m_scale = 1.0;\n m_minScale = 0.25;\n m_maxScale = 4.0;\n m_lastPos = QPoint();\n m_isDragging = false;\n\n m_scrollBar = new QScrollBar(Qt::Vertical, this);\n m_scrollBar->setPageStep(1);\n connect(m_scrollBar, &QScrollBar::valueChanged, this, [this](int value) {\n if (m_currentPage != value)\n {\n m_currentPage = value;\n emit currentPageChanged(m_currentPage);\n update();\n }\n });\n\n QTimer::singleShot(0, this, [this]() {\n m_scrollBar->setRange(0, m_pdfPages.size() - 1);\n m_scrollBar->setPageStep(1);\n m_scrollBar->setSingleStep(1);\n updateScrollBar();\n });\n}\n\nbool PdfViewerWidget::loadPdf(const QString &filePath)\n{\n m_filePath = filePath;\n\n if (!m_pdfPages.isEmpty())\n {\n for (PdfPage *pdfPage : m_pdfPages)\n {\n delete pdfPage;\n }\n\n m_pdfPages.clear();\n }\n\n int pageCount = qpdf::numPages(filePath.toStdString().c_str());\n\n if (pageCount <= 0)\n {\n return false;\n }\n\n for (int pageIndex = 0; pageIndex < pageCount; ++pageIndex)\n {\n PdfPage *pdfPage = new PdfPage(filePath, pageIndex);\n m_pdfPages.append(pdfPage);\n }\n\n m_currentPage = 0;\n emit currentPageChanged(m_currentPage);\n\n return true;\n}\n\nint PdfViewerWidget::currentPage() const\n{\n return m_currentPage;\n}\n\nPdfPage *PdfViewerWidget::getPdfPage(int pageIndex) const\n{\n if (pageIndex >= 0 && pageIndex < m_pdfPages.size())\n {\n return m_pdfPages.at(pageIndex);\n }\n\n return nullptr;\n}\n\nvoid PdfViewerWidget::paintEvent(QPaintEvent *event)\n{\n QPainter painter(this);\n painter.fillRect(event->rect(), Qt::white);\n\n if (!m_pdfPages.isEmpty())\n {\n PdfPage *pdfPage = m_pdfPages.at(m_currentPage);\n\n if (pdfPage)\n {\n qreal devicePixelRatioF = devicePixelRatioF();\n QSize pageSize = pdfPage->pageSize();\n QSize scaledPageSize(pageSize.width() * m_scale * devicePixelRatioF, pageSize.height() * m_scale * devicePixelRatioF);\n QImage image = pdfPage->renderToImage(scaledPageSize, m_scale * devicePixelRatioF);\n\n if (!image.isNull())\n {\n painter.drawImage(0, 0, image);\n }\n }\n }\n}\n\nvoid PdfViewerWidget::mousePressEvent(QMouseEvent *event)\n{\n if (event->button() == Qt::LeftButton)\n {\n m_lastPos = event->pos();\n m_isDragging = true;\n }\n}\n\nvoid PdfViewerWidget::mouseMoveEvent(QMouseEvent *event)\n{\n if (m_isDragging)\n {\n int deltaX = event->pos().x() - m_lastPos.x();\n int deltaY = event->pos().y() - m_lastPos.y();\n\n if (!m_pdfPages.isEmpty())\n {\n PdfPage *pdfPage = m_pdfPages.at(m_currentPage);\n\n if (pdfPage)\n {\n int scrollBarMaxValue = m_scrollBar->maximum();\n int scrollBarValue = m_scrollBar->value();\n\n if (pdfPage->pageSize().height() * m_scale > height() && scrollBarMaxValue > 0)\n {\n m_scrollBar->setValue(scrollBarValue - deltaY);\n }\n }\n }\n\n m_lastPos = event->pos();\n }\n}\n\nvoid PdfViewerWidget::wheelEvent(QWheelEvent *event)\n{\n int delta = event->angleDelta().y();\n\n if (delta > 0)\n {\n if (m_scale < m_maxScale)\n {\n m_scale += 0.1;\n }\n }\n else if (delta < 0)\n {\n if (m_scale > m_minScale)\n {\n m_scale -= 0.1;\n }\n }\n\n update();\n}\n\nvoid PdfViewerWidget::resizeEvent(QResizeEvent *event)\n{\n QWidget::resizeEvent(event);\n updateScrollBar();\n}\n\nvoid PdfViewerWidget::updateScrollBar()\n{\n int scrollBarMaxValue = m_scrollBar->maximum();\n int scrollBarValue = m_scrollBar->value();\n\n if (!m_pdfPages.isEmpty())\n {\n PdfPage *pdfPage = m_pdfPages.at(m_currentPage);\n\n if (pdfPage)\n {\n int scrollBarPageSize = qMax(1, qCeil((pdfPage->pageSize().height() * m_scale - height()) / (double)height()));\n\n if (scrollBarPageSize != m_scrollBar->pageStep())\n {\n m_scrollBar->setPageStep(scrollBarPageSize);\n }\n\n if (scrollBarMaxValue != scrollBarPageSize)\n {\n m_scrollBar->setRange(0, scrollBarPageSize);\n }\n\n if (scrollBarValue > scrollBarMaxValue)\n {\n m_scrollBar->setValue(scrollBarMaxValue);\n }\n }\n }\n\n m_scrollBar->setGeometry(width() - m_scrollBar->width(), 0, m_scrollBar->width(), height());\n}\n\n\n8. 创建一个PdfPage类来表示PDF文件中的每一页:\n\ncpp\nclass PdfPage\n{\npublic:\n PdfPage(const QString &filePath, int pageIndex);\n ~PdfPage();\n\n QSize pageSize() const;\n QImage renderToImage(const QSize &size, qreal scale) const;\n void renderToPainter(QPainter *painter) const;\n\nprivate:\n const QString m_filePath;\n const int m_pageIndex;\n mutable QSize m_pageSize;\n};\n\nPdfPage::PdfPage(const QString &filePath, int pageIndex) : m_filePath(filePath), m_pageIndex(pageIndex)\n{\n}\n\nPdfPage::~PdfPage()\n{\n}\n\nQSize PdfPage::pageSize() const\n{\n if (m_pageSize.isNull())\n {\n qpdf::QPDF qpdf;\n qpdf.processFile(m_filePath.toStdString().c_str());\n\n qpdf::QPDFPageObjectHelper pageObjectHelper;\n pageObjectHelper.processPage(qpdf, m_pageIndex + 1);\n\n m_pageSize = QSize(qpdf::QUtil::int_to_double(pageObjectHelper.getPageWidth()), qpdf::QUtil::int_to_double(pageObjectHelper.getPageHeight()));\n }\n\n return m_pageSize;\n}\n\nQImage PdfPage::renderToImage(const QSize &size, qreal scale) const\n{\n QImage image(size, QImage::Format_ARGB32);\n image.fill(Qt::transparent);\n\n QPainter painter(&image);\n painter.setRenderHint(QPainter::Antialiasing);\n painter.setRenderHint(QPainter::SmoothPixmapTransform);\n\n qpdf::QPDF qpdf;\n qpdf.processFile(m_filePath.toStdString().c_str());\n\n qpdf::QPDFPageObjectHelper pageObjectHelper;\n pageObjectHelper.processPage(qpdf, m_pageIndex + 1);\n\n double width = qpdf::QUtil::int_to_double(pageObjectHelper.getPageWidth());\n double height = qpdf::QUtil::int_to_double(pageObjectHelper.getPageHeight());\n\n double scaleX = size.width() / (width * scale);\n double scaleY = size.height() / (height * scale);\n\n painter.scale(scaleX, scaleY);\n painter.translate(0, 0);\n\n pageObjectHelper.render(&painter, 0, 0, width, height);\n\n return image;\n}\n\nvoid PdfPage::renderToPainter(QPainter *painter) const\n{\n qpdf::QPDF qpdf;\n qpdf.processFile(m_filePath.toStdString().c_str());\n\n qpdf::QPDFPageObjectHelper pageObjectHelper;\n pageObjectHelper.processPage(qpdf, m_pageIndex + 1);\n\n double width = qpdf::QUtil::int_to_double(pageObjectHelper.getPageWidth());\n double height = qpdf::QUtil::int_to_double(pageObjectHelper.getPageHeight());\n\n pageObjectHelper.render(painter, 0, 0, width, height);\n}\n\n\n9. 创建Qt应用程序并显示PDF查看器窗口:\n\ncpp\nint main(int argc, char *argv[])\n{\n QApplication a(argc, argv);\n\n PDFViewerWindow w;\n w.show();\n\n return a.exec();\n}\n\n\n这是一个基本的Qt6 Qoppa PDF Studio Viewer的使用示例。你可以根据需要进行修改和扩展。\n\n

Qt6 Qoppa PDF Studio Viewer 使用示例 - 如何在 Qt 应用程序中查看和打印 PDF 文件

原文地址: https://www.cveoy.top/t/topic/p2jD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录