开源报表工具Limereport交叉编译及使用
0. 写在前面
0.0 开源报表工具调研
0.1Limereport介绍
- 官网地址:https://www.limereport.ru/en/index.php
LimeReport -使用QT框架编写的多平台C++报表生成器库,并为软件开发人员提供,它们希望添加到应用程序的能力中,以形成使用模板生成的报表或打印表单。
库中包含的报表设计器允许创建快速直观的打印表单模板,这些模板可以以XML格式保存并用于生成报表页面。因此,形成的页面可以发送到预览、PDF文件或打印机。
作为数据源,开发人员可以使用SQL数据库或使用QabStretctTableModel接口从应用程序传递的数据。此外,还可以初始化变量,这些变量可用作数据库请求参数。
LimeReport的目标是为您的应用程序提供功能丰富、同时易于使用的工具,以便生成报告,即使是没有经验的IT用户也可以使用
1.最大的优点是基于qt,所以可以跨平台使用;
2.直接拖动设计模板,十分方便
-
使用说明
进入官网页面,进入到下载页面,如下:
源码获取有两种渠道: 1.sourceFoge
2. githubsourceFoge页面
github页面能获取到最新代码
获取release稳定版本。qt5以下版本注意只能选择1.4及以下的版本**
这里我使用的是qt4.8.6;所以我选择的Limereport版本为1.4.51
1.Limereport编译
1.1windows/Linux环境下编译
直接使用qt打开Limereport工程.pro文件,直接编译即可,
默认编译Limereport动态库,如果想要编译静态库,则如下配置即可:
注意使用qt4.8.6,编译qt源码时需要编译tools,因为Limereport依赖Qtuitools等库文件。其他大于次版本qt则无需注意,有安装版本,无需手动编译qt源码。
1.2Limereport交叉编译
我们要想使用这个库到嵌入式设备中,那就需要我们交叉编译,这里我们默认已经交叉编译好qt4.8.6源码了,见我的另一篇博客:https://blog.csdn.net/Wmll1234567/article/details/124284346?spm=1001.2014.3001.5501
首先我们需要配置编译环境,配置如下:
1.配置交叉编译器
2.配置qt版本
3.配置编译套件
配置完成后编译即可
最后编译的结果如图:
2.编译后的Limereport库使用
2.1 添加库头文件和路径
在新工程的pro文件里添加头文件和库路径
- INCLUDEPATH +=…\source\Limereport\Linux\arm-release\include
2.添加库路径
2.2 代码里如何使用
其实可以看源代码使用实例
我觉的Liemereport厉害之处就是报表文件的模板是兼容的,windows上制作模板,其他版本交叉编译的程序也能加载此模板
这是运行limereport官网windows安装包程序设计的模板,
模板文件是.lrxml格式
$V是变量的意思,根据所需去设置变量具体的值
具体使用设置如下:
预览的结果:
2.2.2 代码详细讲解
源文件添加上述头文件
主要核心的两个类接口
LimeReport::ReportEngine (服务类,负责模板加载、生成pdf等)
LimeReport::PreviewReportWidget(显示预览类,主要就是预览模板)
全部使用的代码如下:
//FReportPreview.h
#ifndef FREPORTPREVIEW_H
#define FREPORTPREVIEW_H
#include <QWidget>
#include "ui_FReportPreview.h"
#include "lrreportengine.h"
#include "lrcallbackdatasourceintf.h"
#include <QLayout>
#include <QGesture>
#include <QGestureEvent>
#include <QPinchGesture>
#include <QDebug>
#include <QScrollBar>
class FReportPreview : public QWidget
{
Q_OBJECT
public:
FReportPreview(QWidget *parent = 0);
~FReportPreview();
private slots:
void on_desiner_clicked();
void on_pushButton_clicked();
void InitWidget();
void on_print_start_clicked();
void on_pdf(LimeReport::ReportEngine *report);
protected:
bool event(QEvent *event);
private:
bool gestureEvent(QGestureEvent *event);
void pinchTriggered(QPinchGesture*);
private:
Ui::FReportPreview *ui;
LimeReport::ReportEngine *report;
LimeReport::PreviewReportWidget* m_preview;
QString print_name;
int print_sex;
int print_years;
QString print_ID;
QString record_Date;
QString Doctor;
QString Print_date;
QString Print_image_path;
};
#endif // FREPORTPREVIEW_H
//FReportPreview.cpp
#include "FReportPreview.h"
#include <QHBoxLayout>
#include <QFileInfo>
#include <QGesture>
#include <QGestureEvent>
#include <QPinchGesture>
FReportPreview::FReportPreview(QWidget *parent)
: QWidget(parent),
ui(new Ui::FReportPreview)
{
ui->setupUi(this);
//ui->desiner->hide();
ui->pushButton->hide();
//setMouseTracking(true);
InitWidget();
//setWindowFlags(Qt::FramelessWindowHint);
report = new LimeReport::ReportEngine();
m_preview = report->createPreviewWidget();
report->dataManager()->setReportVariable("company_name",tr("Coronary Function Measurement Record"));
report->dataManager()->setReportVariable("date",tr("Record Date:"));
report->dataManager()->setReportVariable("m_patent_name",tr("Name:"));
report->dataManager()->setReportVariable("m_patient_sex",tr("Sex:"));
report->dataManager()->setReportVariable("m_patient_year",tr("Years:"));
report->dataManager()->setReportVariable("m_patent_id",tr("ID:"));
report->dataManager()->setReportVariable("m_image",tr("Waveform:"));
report->dataManager()->setReportVariable("m_doctor",tr("Doctor:"));
report->dataManager()->setReportVariable("m_patient_sex",tr("Sex:"));
report->dataManager()->setReportVariable("m_print_date",tr("Print date:"));
report->dataManager()->setReportVariable("patent_name",print_name);
report->dataManager()->setReportVariable("patent_sex",print_sex);
report->dataManager()->setReportVariable("patent_year",print_years);
report->dataManager()->setReportVariable("patent_ID",print_ID);
report->dataManager()->setReportVariable("patent_doctor",Doctor);
report->dataManager()->setReportVariable("print_date",Print_date);
report->dataManager()->setReportVariable("record_date",record_Date);
if(report->dataManager()->containsVariable("image"));
{
report->dataManager()->setReportVariable("image",Print_image_path);
}
QFileInfo fileInfo("FFR-all.lrxml");
if(fileInfo.isFile())
{
report->loadFromFile("FFR-all.lrxml");
m_preview->refreshPages();
}
m_preview->setScalePercent(50);
//m_preview->setAttribute( Qt::WA_Hover,true);
QVBoxLayout *vbox = new QVBoxLayout();
m_preview->resize(1200,1600);
vbox->addWidget(m_preview);
ui->groupBox->setLayout(vbox);
//setStyleSheet("QWidget{background-color:rgb(255, 255, 0)}");
connect(ui->desiner, SIGNAL(clicked()), this, SLOT(on_desiner_clicked()));
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));
connect(ui->pushButton_2, SIGNAL(clicked()), m_preview, SLOT(zoomIn()));
connect(ui->pushButton_3, SIGNAL(clicked()), m_preview, SLOT(zoomOut()));
ui->pushButton_4->raise();
ui->pushButton_4->show();
//setAttribute( Qt::WA_Hover,true);
/*ui->widget->raise();
QPalette palette;
palette.setColor(QPalette::Background, QColor(0,0,0,150)); // 最后一项为透明度
//palette.setBrush(QPalette::Background, QBrush(QPixmap(":/background.png")));
ui->widget->setMouseTracking(true);
ui->widget->setPalette(palette);*/
//ui->groupBox->layout()->
//ui->scrollArea->setWidget(ui->groupBox);
//ui->scrollArea->setAttribute( Qt::WA_Hover,true);
//ui->scrollArea->verticalScrollBar()->setValue(1000);
}
FReportPreview::~FReportPreview()
{
delete ui;
}
bool FReportPreview::event(QEvent *event)
{
qDebug("%d",event->type());
//int nTotalValue = ui->scrollArea->verticalScrollBar()->value();
if (event->type() == QEvent::HoverEnter || event->type() == QEvent::HoverLeave
|| event->type() == QEvent::HoverMove)
{
QHoverEvent* pHoverEvent = static_cast<QHoverEvent *>(event);
//if(event->type() == QEvent::HoverEnter){
int nTotalValue = ui->scrollArea->verticalScrollBar()->value();
//2:将滚动条的位置设置成二分之一处。
int nNewLoaction = nTotalValue*0.5;
ui->scrollArea->verticalScrollBar()->setValue(1000);
//}
}
return QWidget::event(event);
}
bool FReportPreview::gestureEvent(QGestureEvent *event)
{
if (QGesture *pinch = event->gesture(Qt::PinchGesture)){
pinchTriggered(static_cast<QPinchGesture *>(pinch));
//FLogError("gestureEvent");
}
return true;
}
void FReportPreview::pinchTriggered(QPinchGesture *gesture)
{
// QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
// if (changeFlags & QPinchGesture::ScaleFactorChanged) {
// currentStepScaleFactor = gesture->totalScaleFactor();
// }
// if (gesture->state() == Qt::GestureFinished) {
// scaleFactor *= currentStepScaleFactor;
// currentStepScaleFactor = 1;
// }
//FLogError("pinchTriggered");
m_preview->zoomOut();
update();
}
void FReportPreview::InitWidget() {
ui->print_color->clear();
QStringList langts;
langts << tr("colour")
<< tr("black-and-white");
ui->print_color->insertItem(0, langts[0]);
ui->print_color->insertItem(1, langts[1]);
QStringList langts1;
langts1 << tr("colour")
<< tr("black-and-white");
ui->place->insertItem(0, langts[0]);
ui->place->insertItem(1, langts[1]);
print_name = "zhangsan";
print_sex =0;
print_years=0;
print_ID = "20220427034724";
record_Date = "2022-2-29 10:23:37";
Doctor = "WangQiang";
Print_date = "2022-5-10 10:23:37";
Print_image_path = "20220601112220.png";
}
void FReportPreview::on_desiner_clicked()
{
report->designReport();
}
void FReportPreview::on_pushButton_clicked()
{
m_preview->show();
}
void FReportPreview::on_pdf(LimeReport::ReportEngine *report){
report->printToPDF("wml3.pdf");
}
void FReportPreview::on_print_start_clicked()
{
on_pdf(report);
}
这个demo运行结果如下