交叉编译mupdf 在ARM板上读取pdf
CXX = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
LD = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
AR = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar
2. 源码包到Ubuntu 下解压 : 进入源码路径 mupdf-1.15.0-source 中 修改编译依赖的文件 Makerules 修改:
# Configuration for the Makefile
OS := $(shell uname)
OS := $(OS:MINGW%=MINGW)
OS := $(OS:MSYS%=MINGW)
OS := $(OS:Windows_NT=MINGW)
OS := $(OS:Darwin=MACOS)ifeq ($(findstring -fembed-bitcode,$(XCFLAGS)),)
# clang does not support these in combination with -fembed-bitcode
CFLAGS += -ffunction-sections -fdata-sections
endififeq ($(OS),MACOS)
LDREMOVEUNREACH := -Wl,-dead_strip
else
LDREMOVEUNREACH := -Wl,--gc-sections
endifSANITIZE_FLAGS += -fsanitize=address
SANITIZE_FLAGS += -fsanitize=leakifeq ($(build),debug)
CFLAGS += -pipe -g
LDFLAGS += -g
else ifeq ($(build),release)
CFLAGS += -pipe -O2 -DNDEBUG -fomit-frame-pointer
LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s
else ifeq ($(build),small)
CFLAGS += -pipe -Os -DNDEBUG -fomit-frame-pointer
LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s
else ifeq ($(build),valgrind)
CFLAGS += -pipe -O2 -DNDEBUG -DPACIFY_VALGRIND -fno-omit-frame-pointer
LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s
else ifeq ($(build),sanitize)
CFLAGS += -pipe -g -fno-omit-frame-pointer $(SANITIZE_FLAGS)
LDFLAGS += -g $(SANITIZE_FLAGS)
else ifeq ($(build),sanitize-release)
CFLAGS += -pipe -O2 -DNDEBUG -fno-omit-frame-pointer $(SANITIZE_FLAGS)
LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s $(SANITIZE_FLAGS)
else ifeq ($(build),profile)
CFLAGS += -pipe -O2 -DNDEBUG -pg
LDFLAGS += -pg
else ifeq ($(build),coverage)
CFLAGS += -pipe -g -pg -fprofile-arcs -ftest-coverage
LIBS += -lgcov
else ifeq ($(build),native)
CFLAGS += -pipe -O2 -DNDEBUG -fomit-frame-pointer -march=native
LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s
else ifeq ($(build),memento)
CFLAGS += -pipe -g -DMEMENTO
LDFLAGS += -g -d -rdynamic
ifneq ($(HAVE_LIBDL),no)
CFLAGS += -DHAVE_LIBDL
LIBS += -ldl
endif
else ifeq ($(build),gperf)
CFLAGS += -pipe -O2 -DNDEBUG -fomit-frame-pointer -DGPERF
LIBS += -lprofiler
else
$(error unknown build setting: '$(build)')
endif# Default system libraries
SYS_FREETYPE_LIBS := -lfreetype2
SYS_HARFBUZZ_LIBS := -lharfbuzz
SYS_JBIG2DEC_LIBS := -ljbig2dec
SYS_JPEGXR_LIBS := -ljpegxr
SYS_LCMS2_LIBS := -llcms2-art
SYS_LIBJPEG_LIBS := -ljpeg
SYS_MUJS_LIBS := -lmujs
SYS_OPENJPEG_LIBS := -lopenjp2
SYS_ZLIB_LIBS := -lzifeq ($(OS),MINGW)
WINDRES := windres
HAVE_WIN32 := yeselse ifeq ($(OS),MACOS)
HAVE_GLUT := yes
SYS_GLUT_CFLAGS := -Wno-deprecated-declarations
SYS_GLUT_LIBS := -framework GLUT -framework OpenGL
CC = xcrun cc
AR = xcrun ar
LD = xcrun ld
RANLIB = xcrun ranlibelse ifeq ($(OS),Linux)
HAVE_OBJCOPY := yesifeq ($(shell pkg-config --exists freetype2 && echo yes),yes)
SYS_FREETYPE_CFLAGS := $(shell pkg-config --cflags freetype2)
SYS_FREETYPE_LIBS := $(shell pkg-config --libs freetype2)
endif
ifeq ($(shell pkg-config --exists harfbuzz && echo yes),yes)
SYS_HARFBUZZ_CFLAGS := $(shell pkg-config --cflags harfbuzz)
SYS_HARFBUZZ_LIBS := $(shell pkg-config --libs harfbuzz)
endif
ifeq ($(shell pkg-config --exists lcms2 && echo yes),yes)
SYS_LCMS2_CFLAGS := $(shell pkg-config --cflags lcms2)
SYS_LCMS2_LIBS := $(shell pkg-config --libs lcms2)
endif
ifeq ($(shell pkg-config --exists libjpeg && echo yes),yes)
SYS_LIBJPEG_CFLAGS := $(shell pkg-config --cflags libjpeg)
SYS_LIBJPEG_LIBS := $(shell pkg-config --libs libjpeg)
endif
ifeq ($(shell pkg-config --exists libopenjp2 && echo yes),yes)
SYS_OPENJPEG_CFLAGS := $(shell pkg-config --cflags libopenjp2)
SYS_OPENJPEG_LIBS := $(shell pkg-config --libs libopenjp2)
endif
ifeq ($(shell pkg-config --exists zlib && echo yes),yes)
SYS_ZLIB_CFLAGS := $(shell pkg-config --cflags zlib)
SYS_ZLIB_LIBS := $(shell pkg-config --libs zlib)
endifHAVE_GLUT := yes
ifeq ($(HAVE_GLUT),yes)
SYS_GLUT_CFLAGS :=
SYS_GLUT_LIBS := -lglut -lGL
endifHAVE_X11 := $(shell pkg-config --exists x11 xext && echo yes)
ifeq ($(HAVE_X11),yes)
X11_CFLAGS := $(shell pkg-config --cflags x11 xext)
X11_LIBS := $(shell pkg-config --libs x11 xext)
endifHAVE_LIBCRYPTO := $(shell pkg-config --exists 'libcrypto >= 1.1.0' && echo yes)
ifeq ($(HAVE_LIBCRYPTO),yes)
LIBCRYPTO_CFLAGS := $(shell pkg-config --cflags libcrypto) -DHAVE_LIBCRYPTO
LIBCRYPTO_LIBS := $(shell pkg-config --libs libcrypto)
endifHAVE_PTHREAD := yes
ifeq ($(HAVE_PTHREAD),yes)
PTHREAD_CFLAGS :=
PTHREAD_LIBS := -lpthread
endifendif
# The following section has various cross compilation configurations.
#
# Invoke these as:
# make OS=mingw32-cross
#
# This does rely on the generated directory being populated with the font files.
# On a unix-like system, run 'make generate' before doing the cross compile.
# On Windows, run 'nmake -f scripts\fontdump.nmake' in a Visual Studio command prompt.# 文件原始内容,改为自己arm平台依赖的交叉工具ifeq "$(OS)" "wasm"OUT := build/wasm/$(build)CC = emccCXX = em++HAVE_GLUT=noHAVE_X11=noHAVE_OBJCOPY=noHAVE_LIBCRYPTO=noendif# 修改后的内容
ifeq "$(OS)" "arm-linux"
OUT := build/arm-linux/$(build)
CC = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
CXX = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
LD = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
AR = /home/arm-20210720/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar
HAVE_GLUT=no
HAVE_X11=no
HAVE_OBJCOPY=no
HAVE_LIBCRYPTO=no
CROSSCOMPILE=yes
HAVE_GLUT:=no
endififeq "$(OS)" "mingw32-cross"
OUT := build/$(OS)/$(build)
CC = i686-w64-mingw32-gcc
CXX = i686-w64-mingw32-g++
LD = i686-w64-mingw32-gcc
AR = i686-w64-mingw32-ar
WINDRES = i686-w64-mingw32-windres
HAVE_WIN32=yes
endififeq "$(OS)" "mingw64-cross"
OUT := build/$(OS)/$(build)
CC = x86_64-w64-mingw32-gcc
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-gcc
AR = x86_64-w64-mingw32-ar
WINDRES = x86_64-w64-mingw32-windres
HAVE_WIN32=yes
endif# Most variables when building for iOS are set up in ios/build_libs.sh,
# which is called from the Xcode project as a "Run Script" build step.
# The following section works for both device and simulator builds.
ifeq "$(OS)" "ios"
CC = xcrun cc
CXX = xcrun c++
AR = xcrun ar
LD = xcrun ld
RANLIB = xcrun ranlib
endif
3.修改完编译依赖的文件后开始编译前 : 先在源码路径下创建 build 文件?
1). 根据 Makerules 文件提示首先执行 : make generate 在源码路径下生成 generated 目录
2). 执行make编译 :make OS=arm-linux build=release OS 指定使用哪个配置编译,build指定在源码路径下build 生成 编译后的文件,最后未报错,则编译成功,报错,从头再来
期间试了好几个版本没有成功,最终使用的是 这个 mupdf-1.15.0 最终在源码路径下的build 下生成静态库:
因为在 make 的时候指定的是 “arm-linux” 选项的编译所以生成的对应的是此选项的库
4.编译完源码移植到QT 中使用
1)。首先创建一个空的工程,然后把生成的四个静态库引入 :[【 libmupdf.a libmupdf-pkcs7.a libmupdf-third.a libmupdf-threads.a 】
2)。在源码路径下的include 目录下存在着需要引用的头文件,把整个文件夹拷贝到工程目录下
3) 工程中使用
5.一个简单的基于QT 的例子:自定义封装一个类
在工程文件 .pro 中引入静态库,此处我给的是绝对路径,然后就可以使用了
需要修改头文件路径到自己工程指定的路径下:
pdfreader.cpp 文件:
#include "pdfreader.h"PdfReader::PdfReader(QWidget *parent,QString path) :QWidget(parent)
{this->grabKeyboard();this->resize(1024,600);this->setAttribute(Qt::WA_DeleteOnClose,true); // 设置窗体关闭释放申请的空间属性mainWidget = new QWidget(this);mainWidget->resize(1024,600);mainWidget->move(0,0);mainWidget->setStyleSheet("background:rgb(213,205,169);");this->filePath = path;
// -------------------------------->pageNum=0;//第一页为0zoom=1; //100%缩放比rotate=0;//旋转为0//创建上下文ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);if (!ctx){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << stderr<<"cannot create mupdf context";
#endifreturn;}//注册文档控制fz_try(ctx)fz_register_document_handlers(ctx);fz_catch(ctx){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ <<stderr<<"cannot register document handlers:"<< fz_caught_message(ctx);
#endiffz_drop_context(ctx);return;}char *temp = NULL;if(filePath.isEmpty() == false){QByteArray byteArray = filePath.toLocal8Bit();temp = byteArray.data();}if(temp == NULL){qWarning() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << " file name is null ";return;}//打开文档fz_try(ctx)doc = fz_open_document(ctx, temp); // Boost程序库完全开发指南深入C++准标准库.pdffz_catch(ctx){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << stderr<< "cannot open document:"<< fz_caught_message(ctx);
#endiffz_drop_context(ctx);return;}//取得总的页数fz_try(ctx)pageCnt = fz_count_pages(ctx, doc);fz_catch(ctx){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ <<stderr<< "cannot count number of pages:"<< fz_caught_message(ctx);
#endiffz_drop_document(ctx, doc);fz_drop_context(ctx);return;}
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << "pageCnt: "<< pageCnt;
#endif//get outlinefz_outline *outline = fz_load_outline(ctx, (fz_document*)doc);fz_try(ctx)fz_print_outline(ctx, fz_stderr(ctx), outline, 0);fz_always(ctx)fz_drop_outline(ctx, outline);fz_catch(ctx)fz_rethrow(ctx);//LogoArea = new QScrollArea(mainWidget);LogoArea->setGeometry(0, 0, 1024-80, 600);LogoArea->move(80,0);LogoArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);LogoArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);pdfLabel=new QLabel(mainWidget);pdfLabel->setVisible(false);LogoArea->setWidget(pdfLabel);LogoArea->setAlignment(Qt::AlignCenter);QStringList barQss ;barQss.append("QScrollBar:vertical {border:0px solid rgb(237,237,237);background:rgb(255,237,237);width:3px; margin-top:0px;margin-bottom:0px;}");barQss.append("QScrollBar::handle:vertical {background:rgb(255,0,0);border-radius:6px;min-height:80px;}"); // 滑块设置barQss.append("QScrollBar::sub-line:vertical{height:0px;subcontrol-position:top;subcontrol-origin:margin;}");barQss.append("QScrollBar::add-line:vertical{height:0px;subcontrol-position:bottom;subcontrol-origin:margin;}");LogoArea->verticalScrollBar()->setStyleSheet(barQss.join(""));
// LogoArea->horizontalScrollBar()->setStyleSheet(barQss.join(""));pageInfoLabel = new QLabel(this);pageInfoLabel->resize(80,40);pageInfoLabel->move(0,10);pageInfoLabel->setStyleSheet("background:rgb(255,255,255);");pageInfoLabel->setAlignment(Qt::AlignCenter);QStringList btnQss ;btnQss.append(QString("QPushButton{outline:none;border-style:solid;border-color:#035593;border-radius:5px;color:#000000;background:rgb(208,208,208);}"));btnQss.append(QString("QPushButton:pressed{color:#A0DAFB;background:rgb(133,133,133);}"));QPushButton* zoomInBtn = new QPushButton(this);zoomInBtn->setText("放大");zoomInBtn->resize(80,50);zoomInBtn->move(0,120);zoomInBtn->setStyleSheet(btnQss.join(""));connect( zoomInBtn, SIGNAL(released()), this, SLOT(zoom_in_btn_handler()));QPushButton* zoomOutBtn = new QPushButton(this);zoomOutBtn->setText("缩小");zoomOutBtn->resize(80,50);zoomOutBtn->move(0,180);zoomOutBtn->setStyleSheet(btnQss.join(""));connect( zoomOutBtn, SIGNAL(released()), this, SLOT(zoom_out_btn_handler()));QPushButton* prevBtn = new QPushButton(this);prevBtn->setText("上一页");prevBtn->resize(80,50);prevBtn->move(0,380);prevBtn->setStyleSheet(btnQss.join(""));connect(prevBtn, SIGNAL(released()), this, SLOT(previous_page_btn_handler()));QPushButton* nextBtn = new QPushButton(this);nextBtn->setText("下一页");nextBtn->resize(80,50);nextBtn->move(0,440);nextBtn->setStyleSheet(btnQss.join(""));connect( nextBtn, SIGNAL(released()), this, SLOT(next_page_btn_handler()));QPushButton* backBtn = new QPushButton(this);backBtn->setText("返回");backBtn->resize(80,50);backBtn->move(0,540);backBtn->setStyleSheet(btnQss.join(""));connect( backBtn, SIGNAL(released()), this, SLOT(back_btn_handler()));if (pageNum < 0 || pageNum >= pageCnt){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << stderr << "page number out of range: "<< pageNum + 1<<"page count:"<<pageCnt;
#endiffz_drop_document(ctx, doc);fz_drop_context(ctx);return;}pageInfoLabel->setText( tr("%1/%2页").arg(pageNum+1).arg(pageCnt) );fz_matrix ctm = fz_scale( zoom, zoom);fz_pre_rotate(ctm, rotate);fz_try(ctx)pix = fz_new_pixmap_from_page_number(ctx, doc, pageNum, ctm, fz_device_rgb(ctx), 0);fz_catch(ctx){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << stderr << "cannot render page: %s\n" << fz_caught_message(ctx);
#endiffz_drop_document(ctx, doc);fz_drop_context(ctx);return;}unsigned char *samples = pix->samples;int width = fz_pixmap_width(ctx, pix);int height = fz_pixmap_height(ctx, pix);
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << "width: "<<width;qDebug() << __FILE__ << __FUNCTION__ << "Line Num : " << __LINE__ << "height: "<<height;
#endifpdfLabel->setGeometry(0,0,width,height);pdfLabel->setAlignment(Qt::AlignCenter);QImage image(samples, width, height,pix->stride,QImage::Format_RGB888);pdfLabel->setPixmap(QPixmap::fromImage(image));pdfLabel->setVisible(true);fz_drop_pixmap(ctx, pix);update();
}PdfReader::~PdfReader()
{
}// 前一页
void PdfReader::previous_page_btn_handler()
{
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << "onPrev";
#endifpageNum--;if(pageNum <= 0)pageNum = 0;pageInfoLabel->setText( tr("%1/%2页").arg(pageNum+1).arg(pageCnt) );update_page();
}// 下一页
void PdfReader::next_page_btn_handler()
{
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << "onNext";
#endifpageNum++;if(pageNum >= pageCnt -1)pageNum = pageCnt -1;pageInfoLabel->setText( tr("%1/%2页").arg(pageNum+1).arg(pageCnt) );update_page();
}// 放大
void PdfReader::zoom_in_btn_handler()
{if(zoom >= 6.5) return;zoom += 0.05;
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << " zoom in : " << zoom ;
#endifupdate_page();
}// 缩小
void PdfReader::zoom_out_btn_handler()
{if(zoom <= 0.65) return;zoom -= 0.05;
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << " zoom out : " << zoom ;
#endifupdate_page();
}void PdfReader::back_btn_handler()
{this->close();
}void PdfReader::fz_print_outline(fz_context *ctx, fz_output *out, fz_outline *outline, int level)
{int i;if(outline == NULL){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << "outline is NULL!";
#endif}while (outline){for (i = 0; i < level; i++)// fz_write_printf(ctx, out, "\t");//fz_write_printf(ctx, out, "%s\t%s\n", outline->title, outline->uri);qDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << outline->title<<" " << outline->uri;if (outline->down)fz_print_outline(ctx, out, outline->down, level + 1);outline = outline->next;}
}void PdfReader::update_page()
{fz_matrix ctm = fz_scale( zoom, zoom);fz_pre_rotate(ctm, rotate);fz_try(ctx)pix = fz_new_pixmap_from_page_number(ctx, doc, pageNum, ctm, fz_device_rgb(ctx), 0);fz_catch(ctx){
#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << stderr << "cannot render page: %s\n"<< fz_caught_message(ctx);
#endiffz_drop_document(ctx, doc);fz_drop_context(ctx);return;}unsigned char *samples = pix->samples;int width = fz_pixmap_width(ctx, pix);int height = fz_pixmap_height(ctx, pix);#if PDF_READER_DEBUGqDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << "width: "<<width;qDebug() << __FILE__ << __FUNCTION__ << " Line Num : " << __LINE__ << "height: "<<height;
#endifpdfLabel->setGeometry(0,0,width,height);pdfLabel->setAlignment(Qt::AlignCenter);QImage image(samples, width, height,pix->stride,QImage::Format_RGB888);pdfLabel->setPixmap(QPixmap::fromImage(image));pdfLabel->setVisible(true);fz_drop_pixmap(ctx, pix);update();
}void PdfReader::keyPressEvent(QKeyEvent *e)
{switch (e->key()){case Qt::Key_F4: // HOMEbreak;case Qt::Key_F5: // backbreak;default:break;}//QWidget::keyPressEvent(e);
}void PdfReader::keyReleaseEvent(QKeyEvent *e)
{switch (e->key()){case Qt::Key_F4: // HOMEe->ignore();break;case Qt::Key_F5: // backthis->close();e->accept();break;default:break;}//QWidget::keyReleaseEvent(e);
}void PdfReader::mousePressEvent(QMouseEvent* event)
{pressFlag = true;pressPoint = event->pos();
}void PdfReader::mouseReleaseEvent(QMouseEvent* event)
{Q_UNUSED(event);pressFlag = false;pressPoint.setX(0);pressPoint.setY(0);
}void PdfReader::mouseMoveEvent(QMouseEvent* event) //鼠标移动函数
{if (pressFlag == false){return;}QPoint curPoint = event->pos();int x_dist = pressPoint.x() - curPoint.x();int y_dist = pressPoint.y() - curPoint.y();LogoArea->horizontalScrollBar()->setValue(LogoArea->horizontalScrollBar()->value() + x_dist);LogoArea->verticalScrollBar()->setValue(LogoArea->verticalScrollBar()->value() + y_dist);pressPoint = curPoint;moveFlag = true;
}
pdfreader.h 文件 :
#ifndef PDFREADER_H
#define PDFREADER_H#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QImage>
#include <QDebug>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QScrollBar>#include "mupdf/pdf.h"
#include "mupdf/fitz.h"#define PDF_READER_DEBUG 1class PdfReader : public QWidget
{Q_OBJECT
public:explicit PdfReader(QWidget *parent = 0,QString path="");~PdfReader();private:QWidget *mainWidget = NULL;QLabel *pdfLabel = NULL; // 显示PDF内容QLabel *pageInfoLabel = NULL; // 显示页码QScrollArea *LogoArea = NULL;float scale = 0;float zoom = 0; // 不能小于0.65, 当为负数时反向放大float rotate = 0; //int pageNum = 0; // 当前页码(从0开始)int pageCnt = 0; // 总页码//fz_context *ctx = NULL;fz_document *doc = NULL;fz_pixmap *pix = NULL;QString filePath = "";bool pressFlag = false;bool moveFlag = false;QPoint pressPoint;
private:void update_page();void fz_print_outline(fz_context *ctx, fz_output *out, fz_outline *outline, int level);
public slots:void previous_page_btn_handler(); // 前一页void next_page_btn_handler(); // 下一页void zoom_in_btn_handler(); // 放大void zoom_out_btn_handler(); // 缩小void back_btn_handler();
protected:virtual void keyPressEvent(QKeyEvent *e);virtual void keyReleaseEvent(QKeyEvent *e);virtual void mousePressEvent(QMouseEvent* event);virtual void mouseReleaseEvent(QMouseEvent* event);virtual void mouseMoveEvent(QMouseEvent* event);};#endif // PDFREADER_H
交叉编译mupdf 在ARM板上读取pdf相关推荐
- 最新版ser2net移植到ARM板上,交叉编译
这个是ser2net源码http://sourceforge.net/projects/ser2net/files/latest/download ser2net是我在玩openwrt时接触的,当时用 ...
- Qt——用在ARM板上的Mplayer(1.3.0,1.0rc4)安装编译步骤!还有,Mplayer背景抖动闪烁问题解答,终于来了!
注意:若转载,请贴上链接"https://blog.csdn.net/qq_41042595/article/details/112308184",如若发现抄袭或未标明来源现象,都 ...
- Qt程序在arm板上运行
1.Qt中的库需要拷贝到arm板上: 2.配置环境变量,参考该文. 总结: 1.可执行程序在终端中运行前,需要配置好环境变量,我们用export的形式配置的,这种形式只在当前终端中生效(因为,如果我们 ...
- 基于I-MX287A的mqtt远程控制ARM板上LED灯小项目总结
最近在学linux嵌入式技术,自己做了一个在周立功的I-MX287A开发板上实现的,基于MQTT远程控制的小项目,其中用到了一些比较好玩和有趣的技术,在这里自己记录分享一下. 额,让我想想该从和处开始 ...
- 手把手教你在ARM板上写一个驱动程序!
摘要:搞嵌入式有两个方向,一个是嵌入式软件开发(MCU方向),另一个是嵌入式软件开发(Linux方向).其中MCU方向基本是裸机开发和RTOS开发.而Linux开发方向又分为驱动开发和应用开发.其中应 ...
- wxX11移植到arm板上
[原]移植wxX11到开发板上 2012-5-18阅读467 评论0 最近几天由于工作安排,要将wxX11程序移植到arm开发板上.一连工作了好几天,终于可以在板子上显示出一个"X" ...
- 【教程】制作能在ARM板上直接运行的gcc本地编译器
编译好的程序的下载链接:百度网盘 请输入提取码(提取码:ocmm) 概述 通常情况下,我们是在电脑里面开一个Linux虚拟机, 在虚拟机里面用交叉编译工具链编译好可执行文件后,将可执行文件拷贝到板子里 ...
- 在iPhone程序上读取PDF文件
怎么在iPhone程序中读取PDF的内容呢?答案是,苹果为我们准备了一个很神奇的framework Q2D(Quartz 2D).Q2D提供了全套的PDF读取API,接下来我们来看看如果简单的使用Q2 ...
- wxX11移植到arm板上(序)
在将wxX11里在程序在arm板子上运行之后,我们发现那上面的程序运行的时候没有边框和标题栏.于是我们就找这方面的解决方法.首先在tinyx里找到了一个窗口管理器twm,当把twm交叉编译完以后,拷到 ...
最新文章
- ecliplse 调试android 断点,如何在Github maven项目上开始调试
- 工业互联网 — TSN — 技术架构
- vba手机号码归属_Android手机号码归属地的查询
- DSDT亮度修复失败
- 矩阵二范数(norm)
- PHP编程最快明白 by www.kuphp.com 案例实战zencart1.38a支付模块简化Fast and Easy Checkout配置...
- Servlet 组件相关的接口、抽象类关系图
- python做的游戏可以导出吗_Python for RenderDoc批量导出模型和贴图
- Linux Mint 20.1 “Ulyssa” 将于 12 月中旬发布
- python网络编程初级
- ArcGIS 如何卸载再重装
- 网摘Android调用WebService
- 推荐一款好用的文件加密传输软件——Kleopatra(含详细使用文档)
- 牛客练习赛89 第一题(牛牛吃米粒)
- 【Python】base64解码报错 Incorrect padding
- 理解什么叫管理vlan与业务VLAN,理解DTP及trunk的配置
- 百度地图迁徙大数据_百度地图迁徙大数据:复工后北上广深城内出行年后首次大幅增长...
- QQ游戏可以进房间,但上不了桌,无法入坐的一次解决经历
- 一阶导数和二阶导数的二阶/四阶中心差分格式
- win下装django
热门文章
- 解决网通iNode 智能客户端共享上网问题
- C语言实现LOL人机挂机辅助程序
- powerpoint 2007字体间距太大的问题
- 微信h5更新服务器 用户不更新,微信网页授权token刷新和缓存问题
- 移动数字图书馆,基于UniApp,Android实现图书管理系统
- 计算机辅助设计 ei,计算机辅助设计在数控机床的应用
- 深度:大数据分析对于中国医疗保险管理的价值(N多案例分析+附下载)
- 两小时玩转学术PPT
- 卢松松博客php模板,仿卢松松博客模板pro版 卢松松博客模板zblogphp版
- 【手把手带你Godot游戏开发 第二弹】名场面临摹 之 街霸3D(本文荣获1024程序员节【最技术奖】)