序
目前Qt的pdf模块还在预览阶段,很久之前就听说了Qt封装了chrome里的pdfium模块,一直想尝试下。恰好自己的电脑重新装了个Ubuntu20.04.这次准备自己编译下。
编译环境的配置
首先本地编译好Qt5.15。
具体Ubuntu如何编译Qt5.15源码可以参考这个
https://www.cryfeifei.top/2020/06/28/qt-compile-linux/
由于我们要自己编译QtWebEngine QtPdf模块,都是一套源码,所以建议自己编译下
其实官方文档都有 https://wiki.qt.io/QtWebEngine/How_to_Try
我这里上下我的编译环境脚本吧。
sudo apt-get install bison build-essential gperf flex ruby python libasound2-dev libbz2-dev libcap-dev
libcups2-dev libdrm-dev libegl1-mesa-dev libgcrypt11-dev libnss3-dev libpci-dev libpulse-dev libudev-dev
libxtst-dev gyp ninja-build
sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev
libfontconfig1-dev libxss-dev libsrtp0-dev libwebp-dev libjsoncpp-dev libopus-dev libminizip-dev
libavutil-dev libavformat-dev libavcodec-dev libevent-dev libvpx-dev libsnappy-dev libre2-dev libprotobuf-dev protobuf-compiler
由于我们自己下载的源码,所以官方文档中建议的git相关的操作全都不需要了
直接新建一个目录,使用我们自己编译好的qmake
mkdir build_webengine
cd build_webengine
/media/zhangpf/work1/Qt5.15/build/bin/qmake /media/zhangpf/work1/Qt5.15/qt-everywhere-src-5.15.1/qtwebengine/qtwebengine.pro
注意点:
- qmake一定要使用绝对路径。
- qmake成功后一定要仔细看configure的提示信息,看pdf模块跟webengine模块是否弄好
- 要多给电脑点swap空间
扩大swap空间
我这增加了64个G的swap空间。 我本地16G物理内存+2G虚拟内存反正编译不过。 回报错 一怒之下就....64G
mkdir /media/zhangpf/work1/swapfile
cd /media/zhangpf/work1/swapfile/
sudo dd if=/dev/zero of=swap bs=1G count=64
sudo mkswap -f swap
sudo swapon swap
在当前编译的终端加上64G。没必要开机就挂载。反正就编译这一次
编译
make -j7 //我本地8核
make install
install之后我们自己编译的qt就可以用webeinine了。
坑
编译安装完成之后,可以新建一个项目,在pro文件中添加
QT += core gui pdf
OK,kit识别pdf模块了
1.使用Qt官方的demo,发现打开,编译不过
然后我又自己重新组织了下工程,这下可以编译通过并使用了。已经上传到github
https://github.com/CryFeiFei/QtPdfTestgithub.com上个图
经过测试,发现多页渲染之类的太流畅了,比我原来使用poppler的效果好太多了。
而且,看源码,发现里面直接引用的pdfium的代码
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qpdflinkmodel_p.h"
#include <private/qabstractitemmodel_p.h>
#include "third_party/pdfium/public/fpdfview.h"
#include <QUrl>
QT_BEGIN_NAMESPACE
class QPdfLinkModelPrivate: public QAbstractItemModelPrivate
{
Q_DECLARE_PUBLIC(QPdfLinkModel)
这些api之类的还没有成为官方正式API,大家可以学习下。
吹一下
- 不用再挂代理下工具链了,源码里都有了
- 渲染真的快啊,真的快
- 书签居然还提供了一个model类,这样都不用自己写了。
QPdfBookmarkModel
- 看类结构,目前widget跟qml是一起的,以后可以解耦。
- 可以从这个源码学习一下Qt是如何封装第三方库的(这是Qt最擅长的
猜测
- qml跟qwidget应该会分开
- 以后这个模块估计会大规模重构(废话)
- pdfium应该会用cmake or qmake重新组织,但是pdfium依赖skia,估计以后会一起打包
- 不知道skia这个第三方库以后会不会嵌入到Qt里,作为Qt的一个新的paintengine来搞。(我倒是有想法,又立一个flag了