ChartDirector应用笔记(二)
关于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应用笔记(二)的更多相关文章
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- Mastering Web Application Development with AngularJS 读书笔记(二)
第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- webpy使用笔记(二) session/sessionid的使用
webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- 《MFC游戏开发》笔记二 建立工程、调整窗口
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...
- JavaScript基础笔记二
一.函数返回值1.什么是函数返回值 函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
随机推荐
- 机器学习技法--学习笔记03--Kernel技巧
背景 上一讲从对偶问题的角度描述了SVM问题,但是始终需要计算原始数据feature转换后的数据.这一讲,通过一个kernel(核函数)技巧,可以省去feature转换计算,但是仍然可以利用featu ...
- JAVA Builder模式构建MAP/LIST的示例
我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...
- python 字符编码问题
原因 近期,用Python处理一些中文的字符串,但是用Python读取文件的中文字符和在代码中输入的中文字符,在判断处理时,例如判断“相等”或者“包含”,总是不能判断,相等或者包含都不起作用.看了字符 ...
- <欧奈尔制胜法则—如何在股市中赚钱>读书笔记
在选择个股建仓时,要选择那些在最近季度报表中,每股收益比上年同期要有较大增幅的股票. 每股收益是指公司税后净利润除以公司普通股的总股本 选择年增长率为25%--50%的公司 年度盈利和季度盈利都要出色 ...
- 深入剖析 redis AOF 持久化策略
本篇主要讲的是 AOF 持久化,了解 AOF 的数据组织方式和运作机制.redis 主要在 aof.c 中实现 AOF 的操作. 数据结构 rio redis AOF 持久化同样借助了 struct ...
- 防抖(Debounce)与节流( throttle)区别
http://www.cnblogs.com/ShadowLoki/p/3712048.html http://blog.csdn.net/tina_ttl/article/details/51830 ...
- Intellij IDEA IDE部署Servlet项目
1.设置Project Structure 2.修改Modules中的Web项目文件默认class编译之后输出位置 3.给Modules中的Web项目添加Web模块 4.修改Web项目Web.xml文 ...
- 一次流量稍高导致web项目慢的问题&解决
项目上线后,用户越来越多,有一天出现一个issue:用户访问特别慢. 首先介绍下架构: haproxy/Nginx / \ node1 node2 | | redis redis(slave) | | ...
- centos中 mysql 5.7安装
以免授权模式启动 编辑 /etc/my.cnf,添加以下内容: linux环境中:vi /etc/my.cnf 在[MySQL(和PHP搭配之最佳组合)d]配置段添加如下两行: user=mysql ...
- DIV实现纵向滚动条overflow-y
DIV实现纵向滚动条overflow-y:scroll的使用, 1.首先设置固定div的宽高2.overflow-y:scroll如果设置overflow:auto;表示当你内容超过div高度出现滚动 ...