关于Simple Bar Chart

Simple bar chart是XYChart大类中的Bar chart类型中的最简单的例子。Bar chart的表现形式简单直观,在数据量较少、数据维度简单等场景下有较好的适用性。对于一个Bar chart,具有俩个重要的组成部分:XY坐标系,Bars。XY坐标具有坐标值、名称等属性,Bar之间具有颜色、间距、宽度等属性。下面的应用实例以Qt为基础,编写了一个简单的对话框程序,展示了ChartDirector类库和Qt结合的一般形式。

效果图

图表数据是随意添加的,添加了保存功能,目前只能保存为内置的文件名和文件格式。

关键代码解读

源代码主要分成两个部分:第一部分是主窗口布局,以XYChartDemo类为主;第二部分实现图表显示,以ImagePanel类为主。下面分别说明:

xychartdemo.h:XYChartDemo类继承自QDialog类,负责窗口绘制和显示。成员包含一个指向ImagePanel对象的指针,其他的成员主要用于窗口布局。

 class XYChartDemo : public QDialog
{
Q_OBJECT public:
XYChartDemo(QWidget *parent = );
~XYChartDemo(); private:
Ui::XYChartDemoClass ui; ImagePanel* m_panel;
QPushButton* m_quitBtn;
QPushButton* m_saveAsBtn;
QVBoxLayout* vlayout;
QHBoxLayout* m_layout;
};

xychartdemo.cpp:

 XYChartDemo::XYChartDemo(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this); //setGeometry(40, 30 ,460, 310);
setFixedSize(, ); m_quitBtn = new QPushButton("Quit");
m_saveAsBtn = new QPushButton("Save as..."); m_layout = new QHBoxLayout;
m_panel = new ImagePanel;
m_layout->addWidget(m_panel, ); vlayout = new QVBoxLayout;
vlayout->addWidget(m_quitBtn);
vlayout->addWidget(m_saveAsBtn);
vlayout->addStretch();
m_layout->addLayout(vlayout);
setLayout(m_layout); connect(m_quitBtn, SIGNAL(clicked()), this, SLOT(close()));
connect(m_saveAsBtn, SIGNAL(clicked()), m_panel, SLOT(onSaveAs()));
} XYChartDemo::~XYChartDemo()
{
delete m_panel;
delete m_quitBtn;
delete m_saveAsBtn; delete vlayout; // the sublayout should be destroyed first.
delete m_layout;
}

构造函数首先对窗口组件进行初始化,添加好布局响应后设置了两个信号槽。第一个连接用于响应“quit”按钮,退出程序;第二个连接用于响应“保存”按钮,用户点击之后即将当前绘制的图表保存为指定格式。析构函数中对组件资源进行了释放,防止内存泄露。
imagepanel.h:

 class ImagePanel : public QWidget
{
Q_OBJECT public:
ImagePanel(QWidget *parent = );
~ImagePanel(); protected slots:
void onSaveAs(); private:
QChartViewer* m_qViewer;
XYChart* m_chart;
};

ImagePanel类继承自QWidget类,用于图表显示。该类包含一个指向QChartViewer对象的指针和一个指向XYChart对象的指针。QChartViewer类在前面说过了,是一个继承自QLabel类的组件类,连接ChartDirector类库和Qt框架。再看看实现文件imagepanel.cpp:

 ImagePanel::ImagePanel(QWidget *parent)
: QWidget(parent)
{
m_qViewer = new QChartViewer(this); const double data[] = {, , , , };
const char* lbels[] = {"Mon", "Tue", "Wed", "Thu", "Fri"}; m_chart = new XYChart(, );
m_chart->setPlotArea(, , , ); // set the color of bar.
BarLayer* blayer = m_chart->addBarLayer(DoubleArray(data, (int)(sizeof(data)/sizeof(data[]))), 0xFF);
m_chart->xAxis()->setLabels(StringArray(lbels, (int)(sizeof(lbels)/sizeof(lbels[])))); blayer->setBarGap(0.5); m_qViewer->setChart(m_chart);
}

如上一篇文件所说的那样,先分配一个XYChart对象。传递绘制区域(400, 300)作为参数调用XYChart的构造函数构造一个XYChart对象;然后调用setPlotArea设置好XY坐标系的位置的坐标区域。在该坐标区域内,可以绘制各种线条和图形。值得注意的是,X、Y轴上面的坐标值和坐标名并不属于PlotArea区域。调用addBarLayer()是一个较为重要的步骤,这里因为要绘制的是Bar chart, 所以使用了addBarLayer()。注意该函数的最后一个参数,0xFF指定了绘制出来的Bar的颜色。需要设定为其他颜色的Bar可以在这里设置。然后就是调用xAxis()等函数设置坐标参数,setChart()函数用于将chart对象设置到QChartViewer对象。这样,就可以在Qt窗口中看到ChartDirector绘制的图表了。

小结

总的来说,绘制过程还是比较简单的。当然,这个图表只是一个较为简单的例子,所以在流程上和代码上并无复杂性可言。本代码在编写过程中使用了VS2010作为编辑器,所以在调用ChartDirector的时候只需要在项目属性中设置好库的路径即可。另外,还需在主程序运行前指定加载lib文件:#pragma comment(lib, "chartdir51.lib")。最后,还需要加ChartDirector库的dll文件复制到生成的可执行文件所在的目录下才能运行,当然其他方法也是存在的。后续将陆续放出更为复杂的图表应用实例。

ChartDirector应用笔记(二)的更多相关文章

  1. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  2. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  3. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  4. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

  7. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  8. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

  9. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

  10. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

随机推荐

  1. C++ 记事本: 变量

    C++ 变量也许和其他语言的变量没有什么差别.就是用来存储一些可能会变值的容器. 当然 C++ 变量里又分为 原子类型 的(int , char ,bool 等等),复合类型 的(struct ,cl ...

  2. git .gitignore 文件 解决二进制文件冲突问题

    .gitignore  主要是添加 忽略文件 .最近团队开发经常出现 UserInterfaceState.xcuserstate 冲突,打开发现是二进制文件 ,没法解决冲突. 只好 rm -rf 之 ...

  3. C# 百度语音合成

    语音合成及TTS,我们尝试使用百度的语音合成技术 不过我发现 有一种缺点在于没有离线包让我有些很不舒服,可能是在线版的 原因微软语音识别技术在Windows 2000是默认集成在系统组件中 或许我们不 ...

  4. Python从内存中使用编译后的模块

    在Windows编程的时候,有些时候,我们经常会要使用一些非常规的方法,比如说从内存中加载DLL,然后使用DLL中的函数.于是就思索在用Python的时候是否能够将几个编译好的Pyc合并成一个,然后使 ...

  5. Nagios 安装配置

    ##Debian 6 安装server # apt-get install nagios* 一路设置好各种密码,成功后访问 http://ip/nagios3 既可,默认用户*nagiosadmin* ...

  6. arcgis flexviewer中由Application向widget传值

    arcgis flexviewer所有的小部件类均继承自com.esri.viewer.BaseWidget基类,而BaseWidget又继承了com.esri.viewer.IBaseWidget接 ...

  7. poj 3077Rounders(模拟)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063? viewmode=contents 题目链接:http://po ...

  8. RedRabbit——基于BrokerPattern服务器框架

    RedRabbit 经典网游服务器架构 该图省略了专门用途的dbserver.guildserver等用于专门功能的server,该架构的优点有: l LoginGate相当于DNS,可以动态的保证G ...

  9. android 开发 - 网络图片加载库 Fresco 的使用。

    概述 Fresco 是 facebook 的开源类库,它支持更有效的加载网络图片以及资源图片.它自带三级缓存功能,让图片显示更高效. 介绍 Fresco 是一个强大的图片加载组件. Fresco 中设 ...

  10. Cocos2d-JS项目之三:使用合图

    studio里使用合图感觉和spriteBatchNode差不多,但有不同,合图只起到在加载资源时减少IO的作用,起不到批渲染的作用.其实想想,studio本来就是用来拼UI界面的,一个上点规模的UI ...