1.main.cpp

  1. #include "themewidget.h"
  2. #include <QtWidgets/QApplication>
  3. #include <QtWidgets/QMainWindow>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. QMainWindow window;
  9. ThemeWidget *widget = new ThemeWidget();
  10. window.setCentralWidget(widget);
  11. window.resize(900, 600);
  12. window.show();
  13. return a.exec();
  14. }
  1. 关于window.setCentralWidget(widget);
    QT帮助:
  1. void QMainWindow::setCentralWidget(QWidget *widget)

  2. //将给定的小部件设置为主窗口的中央小部件
  1. Sets the given widget to be the main window's central widget.

    //注意:QMainWindow拥有窗口小部件指针的所有权,并在适当的时间将其删除。另请参见centralWidget()。
  1. Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time. See also centralWidget().
  1. QWidget *QMainWindow::centralWidget() const
  1. //返回主窗口的中央窗口小部件。如果尚未设置中央窗口小部件,则此函数返回零。
  1. Returns the central widget for the main window. This function returns zero if the central widget has not been set.

2.themewidget.h

  1. #ifndef THEMEWIDGET_H
  2. #define THEMEWIDGET_H
  3.  
  4. #include <QtWidgets/QWidget>
  5. #include <QtCharts/QChartGlobal>
  6.  
  7. QT_BEGIN_NAMESPACE
  8. class QComboBox;
  9. class QCheckBox;
  10. class Ui_ThemeWidgetForm;
  11. QT_END_NAMESPACE
  12.  
  13. QT_CHARTS_BEGIN_NAMESPACE
  14. class QChartView;
  15. class QChart;
  16. QT_CHARTS_END_NAMESPACE
  17.  
  18. typedef QPair<QPointF, QString> Data;
  19. typedef QList<Data> DataList;
  20. typedef QList<DataList> DataTable;
  21.  
  22. QT_CHARTS_USE_NAMESPACE
  23.  
  24. class ThemeWidget: public QWidget
  25. {
  26. Q_OBJECT
  27. public:
  28. explicit ThemeWidget(QWidget *parent = 0);
  29. ~ThemeWidget();
  30.  
  31. private Q_SLOTS:
  32. void updateUI();
  33.  
  34. private:
  35. DataTable generateRandomData(int listCount, int valueMax, int valueCount) const;
  36. void populateThemeBox();
  37. void populateAnimationBox();
  38. void populateLegendBox();
  39. void connectSignals();
  40. QChart *createAreaChart() const;
  41. QChart *createBarChart(int valueCount) const;
  42. QChart *createPieChart() const;
  43. QChart *createLineChart() const;
  44. QChart *createSplineChart() const;
  45. QChart *createScatterChart() const;
  46.  
  47. private:
  48. int m_listCount;
  49. int m_valueMax;
  50. int m_valueCount;
  51. QList<QChartView *> m_charts;
  52. DataTable m_dataTable;
  53.  
  54. Ui_ThemeWidgetForm *m_ui;
  55. };
  56.  
  57. #endif /* THEMEWIDGET_H */

1)关于#ifnde XXX f#define XXX #endif

其作用是“防止头文件被重复引用。”

“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成c.h重复引用。

头文件被重复引用引起的后果:

有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?

答案:不是一定要加,但是不管怎样,用#ifnde xxx #define xxx #endif或者其他方式避免头文件重复包含,只有好处没有坏处。个人觉得培养一个好的编程习惯是学习编程的一个重要分支。

下面给一个#ifndef/#define/#endif的格式:

#ifndef A_H意思是"if not define a.h"  如果不存在a.h

接着的语句应该#define A_H  就引入a.h

最后一句应该写#endif   否则不需要引入

2)关于QT_BEGIN_NAMESPACE

对于QT_BEGIN_NAMESPACE宏的作用

QT_BEGIN_NAMESPACE其实就是个宏,以前Qt4是没有命令空间的,后来才加上的,编译Qt源码时会有选项,是否将这些类放到专用的Qt命令空间内,默认是没有的。这就出来问题了,为了统一,如果你的代码在默认没有Qt命令空间的SDK中编译,那你就不用在前面加上命令空间,反之则需要。

为了屏蔽上面这个差异,使得你的代码能在这两种情况下都进行编译,Qt就提供了QT_BEGIN_NAMESPACE宏,这样开发者就省的自己来用程序或宏进行处理了。

补充:关于namespace

假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。

同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。

因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

关于QT_CHARTS_BEGIN_NAMESPACE同理。

QT项目-Chart Themes Example学习(一)的更多相关文章

  1. 开源项目Material Calendar View 学习记录 (一)

    开源项目Material Calendar View 学习记录 Github: https://github.com/prolificinteractive/material-calendarview ...

  2. paip.c++ qt 项目工程互相引用的方法

    paip.c++ qt 项目工程互相引用的方法 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/ ...

  3. Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)

    Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)    转 https://blog.csdn.net/lhl1124281072/article/details/800 ...

  4. Hello World程序演示Qt项目的建立、编译、运行和发布

    一.Qt项目的建立 1.选择项目模板. 选择"文件-->新建文件或工程",在选择模板页面选择Qt C++项目中的"Qt Gui应用"一项,然后单击&quo ...

  5. 使用VisualStudio2015开发QT项目

    一直习惯用VS,做QT项目时,不停的来回切IDE有些不方便.研究了一下QT的编译. 实际QT编译的机制和cmake是相同的,QT的IDE使用pro文件进行项目管理.QMake通过解析pro工程文件,生 ...

  6. 创建Qt项目

    创建Qt项目 1     创建Qt项目 2.1 使用向导创建 打开Qt Creator 界面选择 New Project或者选择菜单栏 [文件]-[新建文件或项目]菜单项 弹出New Project对 ...

  7. 封装QtCore(在非Qt项目里使用QString,QJson,QFileInfo,QFile等类)

    单独封装QtCore 一直以来使用QT的特性使用惯了,很多东西QT都封装得很好.如果突然有一天,不使用QT开发了,是不是不习惯. 比如我们经常使用QString很多方法,string,wstring之 ...

  8. 用CMake 构建Qt 项目

    译:用CMake构建Qt项目作者: Johan Thelin  译者:赖敬文原链接:http://developer.qt.nokia.com/quarterly/view/using_cmake_t ...

  9. 我写了个项目,帮你学习HTTP接口测试!

    端午节我写了一个项目,帮助你学习HTTP接口测试. GitHub地址: https://github.com/defnngj/learning-API-test 整个项目基于Flask和 Reques ...

随机推荐

  1. flutter & dart & vs code & bug

    flutter & dart & vs code & bug Waiting for another flutter command to release the startu ...

  2. taro table component

    taro table component https://juejin.im/post/5d901696f265da5b926bbcaa https://taro-ext.jd.com/search? ...

  3. 远程过程调用框架——gRPC

    gRPC是一款基于http协议的远程过程调用(RPC)框架.出自google.这个框架可以用来相对简单的完成如跨进程service这样的需求开发. 资料参考: https://blog.csdn.ne ...

  4. 教你吃透CSS的盒子模型(Box Model)

    CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周围的H ...

  5. java: 类 RegisterController 是公共的, 应在名为 RegisterController.java 的文

    public声明的类名需要和文件名一致,检查一下

  6. MySQL应用优化

    MySQL应用优化 目录 MySQL应用优化 1.数据库连接池 2.减少对MySQL的访问 3.负载均衡 4.MySQL查询缓存优化 5.MySQL如何使用缓存 6.MySQL内存管理以及优化 原则 ...

  7. FTPClient类的API

    org.apache.commons.NET.ftp Class FTPClient类FTPClient java.lang.Object java.lang.Object继承 org.apache. ...

  8. 用友U8+V12.0安装教程(有需要软件和服务的可以联系我)

    有需要用友U8+V12.0软件和服务的可以联系我 QQ:751824677  1.退出所有杀毒软件 2.先装服务器SQL2008 3.服务器(会计): 经典应用模式--全产品 (解压A盘-执行-Aut ...

  9. Markdown的基本用法与下载

    Markdown的基本用法与下载typora 下载typora 1.在浏览器搜索typora 2.然后点进去 3.往下翻点击Download 4.看自己是什么系统然后在选择 5.选好系统以后再去去选择 ...

  10. Java文件字节流

    //输出和输入流 package com.kangkang.IO; import com.sun.xml.internal.ws.util.xml.CDATA; import java.io.File ...