整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Qt开源作品5-仪表盘交互

Qt开源作品5-仪表盘交互

# 一、前言

Echart是百度研发团队开发的一款报表视图JS插件,功能十分强大,是本人用过的国产作品中最牛逼的,记得四五年前就在qt中使用过,当时用的浏览器控件是webkit,由于5.6以后的版本不再支持webkit,而换用webengine内核,很多人在下载使用后不能正常编译,今天特意抽空做个webengine版本,使得同时支持webkit和webengine。

在webkit中执行JS用的是webView->page()->mainFrame()->evaluateJavaScript(js);

而webengine用的是webView->page()->runJavaScript(js);

在执行效率上,webengine甩webkit好几条街,在拖动滑块动态设置值的时候,webengine的CPU占用只有1%,而webkit居然达到了7%,恐怖!怪不得webkit逐渐被qt抛弃了,webengine只是内存使用上增加了些。

## 二、代码思路

第一步:准备网页文件
```c++
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <script src="echarts.min.js"></script>
</head>
<body>
    <div id="main" style="height:300px;"></div>
</body>
</html>
```

第二步:准备JS函数
```c++
function setGaugeValue(value){
    var option={
    tooltip : {
        formatter: "{a} <br/>{b} : {c}%"
    },
    toolbox: {
        feature: {
            restore: {},
            saveAsImage: {}
        }
    },
    series: [
        {
            name: '业务指标',
            type: 'gauge',
            detail: {formatter:'{value}%'},
            data: [{value: value, name: '完成率'}]
        }
    ]
  };
```

第三步:数据交互
```c++
void Widget::on_horizontalSlider_valueChanged(int value)
{
    QString js=QString("setGaugeValue(%1)").arg(value);
#ifdef webkit
    webView->page()->mainFrame()->evaluateJavaScript(js);
#else
    webView->page()->runJavaScript(js);
#endif
}

## 三、效果图



## 四、开源主页

1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

于报表

做嵌入式基本上用不到报表,但是桌面应用就经常会用到报表功能,在Qt下面可用的报表工具也挺多,需要根据具体的需求来选择,报表有的格式比较规矩,有的则比较特殊,所以要结合具体需求来选择合适的方案。

Qt报表常见方案

我所知道的常见的Qt报表实现方案如下:

  • 通过 ActiveX读写word,在word文档里实现表格的绘制。也可以操作excel文件,但是依赖微软的COM组件;
  • Qxlsx开源的表格操作代码;这个就不依赖微软的offic和COM组件了;
  • 第三方报表库,也有开源的:cutereport、KDReports、limereport等等。由于项目急也没有去细研究这些第三方的库怎么使用。大家有时间可以看看
  • 通过html实现,这个需要结合QTextDocument,QTextDocument是富文本文档类。
  • QPainter直接在QPrinter上绘制表格和数据,这个有点生猛了,也就是自己造轮子,但是也有好处,就是可控性比较强。

简单介绍下方案选择

  • ActiveX依赖windows,不能跨平台,如果你的软件不需要跨平台,也可以使用,功能还是挺强大的,可以预先用word做好模板,然后程序往模板里填充数据即可。
  • 第三方库;如果是时间充足,可以学习学习那些第三方的开源报表库,这些库据说报表效果还是不错的,功能强大。
  • QT开发交流+赀料君羊:714620761
  • Qxlsx;这个是比较强大的开源表格库,可以生成excel表格文件,而且文件里还可以插入图表(直方图、曲线、折线图、饼状图等等),我也是只用过其表格功能,使用比较简单,可以直接引用其源码的工程文件(.prj)。大部分情况都适用。
  • html;这种方案我也试了下,效果不好,主要是我对html一窍不通,用不好……
  • QPainter绘制;QPainter可以在任意QPaintDevice类上绘制各种图形,既然可以绘制任意图形,那自然可以绘制出来报表了,只是实现过程可能有点麻烦,需要计算规划位置坐标之类的,但是非常灵活,报表如果比较复杂或者特殊,可以通过该方案绘制一个模板。

第一次使用qt做报表打印,刚开始用的qxlsx,但是实现效果不是太好,因为报表里数据行数与列数不固定,而且要打印在一张A4纸上,用qxlsx实现起来比较麻烦。后来就换了html,也不理想,最后就用QPainter直接绘制的,效果还不错,

Qt中操作Word并导出报表可以使用QAxObject类来实现。QAxObject是Qt对ActiveX对象的封装,可以用于与Microsoft Office应用程序进行交互。以下是一个简单的示例代码,演示如何使用Qt操作Word并导出报表:

cpp复制代码#include <QtWidgets>
#include <QAxObject>

void exportReportToWord(const QString& reportText, const QString& filePath) {
    QAxObject* wordApplication=new QAxObject("Word.Application", nullptr);
    wordApplication->setProperty("Visible", false);  // 设置Word应用程序不可见

    QAxObject* documents=wordApplication->querySubObject("Documents");
    QAxObject* document=documents->querySubObject("Add()");

    QAxObject* content=document->querySubObject("Content");
    content->dynamicCall("SetText(const QString&)", reportText);  // 将报表文本设置为Word文档内容

    document->dynamicCall("SaveAs(const QString&)", filePath);  // 保存Word文档到指定路径
    document->dynamicCall("Close()");  // 关闭Word文档
    wordApplication->dynamicCall("Quit()");  // 退出Word应用程序

    delete wordApplication;
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 假设有一个报表文本
    QString report="报告内容...";

    // 导出报表到Word文件
    exportReportToWord(report, "report.docx");

    return app.exec();
}

在上述示例中,我们定义了一个exportReportToWord函数,该函数接收报表文本和导出路径作为参数。在函数内部,我们创建了一个Word应用程序对象,并将其设置为不可见(Visible属性设置为false)。

然后,我们使用Documents对象创建一个新的Word文档,并获取文档的Content对象。使用dynamicCall函数,我们通过SetText方法将报表文本设置为Word文档的内容。

接下来,使用dynamicCall的SaveAs方法将Word文档保存到指定的文件路径,并使用dynamicCall的Close方法关闭文档。最后,使用dynamicCall的Quit方法退出Word应用程序。

在main函数中,我们传递报表文本和导出路径,调用exportReportToWord函数来导出报表到Word文件。

请注意,上述示例仅为演示目的,实际应用中可能需要更复杂的操作,比如添加表格、设置样式等。你可以根据具体需求使用QAxObject的各种方法和属性进行操作。