#include "PDFBrow.h"
#include
#include
#include
#include
#include
PDFBrow::PDFBrow(QWidget *parent)
: QWidget{parent}
{ //关闭在析构函数里呢
FPDF_InitLibrary();
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_StaticContents);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_scrollArea = new QScrollArea(this);
m_scrollArea->setBackgroundRole(QPalette::Base);
m_scrollArea->setAlignment(Qt::AlignCenter);
m_scrollArea->setWidgetResizable(false);
m_scrollArea->setFrameShape(QFrame::NoFrame);
view = new QGraphicsView();
view->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOn);
view->setFrameShape(QFrame::NoFrame);
view->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
view->setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
view->setSceneRect(0, 0, view->viewport()->width(), view->viewport()->height());
view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
view->setFixedSize(this->parentWidget()->size());
vScrollBar = m_scrollArea->verticalScrollBar();
hScrollBar = m_scrollArea->horizontalScrollBar();
scene = new QGraphicsScene() ;
m_scrollAreaContentLayout = new QVBoxLayout;
m_scrollAreaContentLayout->addWidget(view);
m_scrollAreaContentLayout->addStretch();
layout_di = new QVBoxLayout;
m_scrollArea->viewport()->setLayout(m_scrollAreaContentLayout);
layout_di->addWidget(m_scrollArea);
this->setLayout(layout_di);
connect(vScrollBar, &QScrollBar::valueChanged, this, &PDFBrow::onScrollBarValueChanged);
connect(hScrollBar, &QScrollBar::valueChanged, this, &PDFBrow::onScrollBarValueChanged);
document = nullptr;
}
void PDFBrow::onScrollBarValueChanged(){
redraw();
}
PDFBrow::~PDFBrow(){
if(m_scrollArea)
delete m_scrollArea;
if(vScrollBar)
delete vScrollBar;
if(hScrollBar)
delete hScrollBar;
if(document)
delete document;
if(scene)
delete scene;
FPDF_DestroyLibrary();
}
void PDFBrow::resizeEvent(QResizeEvent *event){
//在widget重新变更位置时改变scrollba
QWidget::resizeEvent(event);
// this->view ->resize(this->size());
}
PDFDocument* PDFBrow::loadPDF(const QString& fileName){
FPDF_DOCUMENT pdocument = FPDF_LoadDocument(fileName.toStdString().c_str(), nullptr);
if (pdocument) {
PDFDocument* document = new PDFDocument(pdocument);
document->loadAllPage();
this->document = document;
int totalHeight = document->getTotalHeightInPixel();
int maxWidth = document->getMaxWidthInPixel();
vScrollBar->setSingleStep(20);
vScrollBar->setPageStep(20);
hScrollBar->setSingleStep(20);
hScrollBar->setPageStep(20);
vScrollBar->setVisible(true);
hScrollBar->setVisible(true);
vScrollBar->setRange(0, totalHeight - view->height());
hScrollBar->setRange(0, maxWidth - view->width());
};
redraw();
return this->document;
}
void PDFBrow::redraw(){
if (document == nullptr) {
return;
}
// 获取widget大小
int canvasWidth = view->width();
int canvasHeight = this->view->viewport()->height();
qDebug()<<"canvasHeight:"+QString::number(canvasHeight);
int selection = vScrollBar->value();
int hSelection = hScrollBar->value();
QSize canvasSize = view->viewport()->size();
//居中
int beginX = 0;
if (canvasSize.width() > document->getMaxWidthInPixel()) {
beginX = (canvasSize.width() - document->getMaxWidthInPixel()) / 2;
}
// Draw PDF pages to QPixmap and show it on canvas
QList items;
int pageAtY = selection;
PDFPage *page = document->getPageAtPixel(pageAtY);
//获取当前页是第几页
int index = page->getIndex();
//前几页的总长度
int temp = 0;
for(int i=0;igetAllPage()[i].getPageSizeInPixel(document->getFPdf_DOCUMENT())[1];
}
// 当前页应该在这个位置绘制
int maginY = temp - selection;
int paintedCount = 0;
int drawY = maginY;
PDFPage *currentPage = nullptr;
while (paintedCount <=canvasHeight) {
page = document->getPageAtPixel(pageAtY);
if(page==nullptr)
break;
if (currentPage == page) {
break;
}
currentPage = page;
int pageWidth = currentPage->getPageSizeInPixel(this->document->getFPdf_DOCUMENT())[0];
int pageHeight = currentPage->getPageSizeInPixel(this->document->getFPdf_DOCUMENT())[1];
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(currentPage->render(-hSelection + beginX, drawY, pageWidth, pageHeight, 0, 0));
item->setPos(-hSelection + beginX, drawY+1);
items.append(item);
drawY += pageHeight;
// 已经绘制了这么多,离整个clientArea还有一段距离,不够的话接着取下一页
qDebug()<<"pageWidth:"+QString::number(pageWidth)+"pageInDex:"+QString::number(page->getIndex())+"本页pageAtY:"+QString::number(pageAtY)+"pageHeight:"+QString::number(pageHeight)+"maginY:"+QString::number(maginY)+" selection:"+QString::number(selection);
// 下一页的坐标(滚动条偏移+当前页大小+偏移),多一个像素去寻找下一页
pageAtY += pageHeight + 1;
paintedCount = drawY ;
// 下一页画的y坐标
}
scene->clear();
foreach(QGraphicsPixmapItem* item, items) {
scene->addItem(item);
}
view->setScene(scene);
}
在PDFBrow类的构造函数中添加以下代码试试
QPalette p = palette();
p.setColor(QPalette::Window, Qt::white);
setPalette(p);
setStyleSheet("PDFBrow { border-style: none; }");
将设置窗口背景为白色,并将边框样式设置为无。