• 开源报表工具Limereport交叉编译及使用


    0. 写在前面

    0.0 开源报表工具调研

    0.1Limereport介绍

    1. 官网地址:https://www.limereport.ru/en/index.php

    LimeReport -使用QT框架编写的多平台C++报表生成器库,并为软件开发人员提供,它们希望添加到应用程序的能力中,以形成使用模板生成的报表或打印表单。
    库中包含的报表设计器允许创建快速直观的打印表单模板,这些模板可以以XML格式保存并用于生成报表页面。因此,形成的页面可以发送到预览、PDF文件或打印机。
    作为数据源,开发人员可以使用SQL数据库或使用QabStretctTableModel接口从应用程序传递的数据。此外,还可以初始化变量,这些变量可用作数据库请求参数。
    LimeReport的目标是为您的应用程序提供功能丰富、同时易于使用的工具,以便生成报告,即使是没有经验的IT用户也可以使用

    1.最大的优点是基于qt,所以可以跨平台使用;
    2.直接拖动设计模板,十分方便

    1. 使用说明
      进入官网页面,进入到下载页面,如下:
      源码获取有两种渠道: 1.sourceFoge
      2. github

      sourceFoge页面
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      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文件里添加头文件和库路径

    1. 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 
    #include "ui_FReportPreview.h"
    #include "lrreportengine.h"
    #include "lrcallbackdatasourceintf.h"
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    //FReportPreview.cpp
    #include "FReportPreview.h"
    #include 
    #include 
    #include 
    #include 
    #include 
    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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166

    在这里插入图片描述

    这个demo运行结果如下这里是引用

  • 相关阅读:
    Spring之Bean生命周期之二--- Instantiation阶段
    (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
    深度学习基础——残差神经网络(ResNet)
    计算思维相关书籍 计算机思维、数学思维与逻辑思维
    据包捕获和分析工具作原理和用途
    ETL的数据挖掘方式
    计算机图像处理:椒盐噪声和高斯噪声
    三十四、数学知识——约数(试除法 + 约数个数 + 约数之和 + 欧几里得算法)
    Spring笔记(三)(Spring整合web环境)
    复杂网络中的模体motif(python模体检测和随机网络生成)
  • 原文地址:https://blog.csdn.net/Wmll1234567/article/details/124364256