QT开发中文网

使用poppler_page_get_links() 与QTreeView 实现菜单跳转

  1. 引入头文件
#include <QTreeView>
#include <QStandardItemModel>
#include <poppler/qt5/poppler-qt5.h>
  1. 创建一个 QTreeView 和 Poppler::Document 对象
QTreeView *treeView = new QTreeView(this);
Poppler::Document *document = Poppler::Document::load(inputFilePath);
  1. 获取文档的页面数量和每个页面的链接信息
int pageCount = document->numPages();
for (int i = 0; i < pageCount; i++) {
    Poppler::Page *page = document->page(i);
    QList<Poppler::LinkDestination *> linkDestinations = page->linkDestinations();
    
    for (int j = 0; j < linkDestinations.size(); j++) {
        Poppler::LinkDestination *destination = linkDestinations.at(j);
        QString label = destination->title();
        int pageNum = destination->page()-1;
        QRectF rect = destination->linkArea();
        
        // 将菜单项添加到 QTreeView 中
        QStandardItem *item = new QStandardItem(QString("%1").arg(label));
        item->setData(pageNum, Qt::UserRole);
        item->setData(rect.top(), Qt::UserRole + 1);
        treeModel->setItem(i, item);
    }
    
    delete page;
}
  1. 在 QTreeView 上注册信号槽函数,处理用户点击菜单项的事件
connect(treeView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(onTreeItemClicked(const QModelIndex &)));
  1. 在槽函数中获取当前选中的菜单项的页码和位置信息,并将视图滚动到该位置
void onTreeItemClicked(const QModelIndex &index) {
    int pageNum = index.data(Qt::UserRole).toInt();
    qreal yPos = index.data(Qt::UserRole + 1).toReal();
    
    Poppler::Page *page = document->page(pageNum);
    QRectF pageRect = page->pageSize();
    delete page;
    
    qreal dpiScaleFactor = QApplication::desktop()->logicalDpiX() / 72.0;
    int y = static_cast<int>(yPos * dpiScaleFactor);
    
    QScrollBar *scrollBar = pdfView->verticalScrollBar();
    scrollBar->setValue(y);
}

完整示例代码:

#include <QTreeView>
#include <QStandardItemModel>
#include <poppler/qt5/poppler-qt5.h>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr)
        : QMainWindow(parent)
    {
        QTreeView *treeView = new QTreeView(this);
        setCentralWidget(treeView);

        QString inputFilePath = "example.pdf";
        Poppler::Document *document = Poppler::Document::load(inputFilePath);
        if (!document || document->isLocked()) {
            return;
        }

        QStandardItemModel *treeModel = new QStandardItemModel(document->numPages(), 1, this);
        treeModel->setHeaderData(0, Qt::Horizontal, tr("Table of Contents"));
        treeView->setModel(treeModel);

        int pageCount = document->numPages();
        for (int i = 0; i < pageCount; i++) {
            Poppler::Page *page = document->page(i);
            QList<Poppler::LinkDestination *> linkDestinations = page->linkDestinations();

            for (int j = 0; j < linkDestinations.size(); j++) {
                Poppler::LinkDestination *destination = linkDestinations.at(j);
                QString label = destination->title();
                int pageNum = destination->page()-1;
                QRectF rect = destination->linkArea();

                QStandardItem *item = new QStandardItem(QString("%1").arg(label));
                item->setData(pageNum, Qt::UserRole);
                item->setData(rect.top(), Qt::UserRole + 1);
                treeModel->setItem(i, item);
            }

            delete page;
        }

        connect(treeView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(onTreeItemClicked(const QModelIndex &)));
    }

private slots:
    void onTreeItemClicked(const QModelIndex &index) {
        int pageNum = index.data(Qt::UserRole).toInt();
        qreal yPos = index.data(Qt::UserRole + 1).toReal();

        Poppler::Document *document = Poppler::Document::load("example.pdf");
        Poppler::Page *page = document->page(pageNum);
        QRectF pageRect = page->pageSize();
        delete page;
        delete document;

        qreal dpiScaleFactor = QApplication::desktop()->logicalDpiX() / 72.0;
        int y = static_cast<int>(yPos * dpiScaleFactor);

        QScrollBar *scrollBar = pdfView->verticalScrollBar();
        scrollBar->setValue(y);
    }
};

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1043

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?