昨天在玩手机游戏时,见到一个游戏的饼状投票统计图很漂亮,所以我今天也花了一个下午来实现了一个类似的程序娱乐一下,呵呵。

思路:
1:将窗体设为Qt::FramelessWindowHint和Qt::WA_TranslucentBackground(去掉标题栏,背景透明)。
2:重载程序的鼠标事件(移动程序)和键盘事件(模拟投票和退出)。
3:根据投票结果,在paintEvent函数中画几个扇形和其他东西。

操作说明:
1:按数字键0-9模拟投票。

2:按ESC键退出程序。

运行时截图(浅绿色的是桌面背景):

源代码:

    1. #include <QtGui>
    2. class PieDialog : public QDialog
    3. {
    4. Q_OBJECT
    5. private:
    6. int m_Result[10];
    7. QColor m_Color[10];
    8. QPoint m_CurrentPos;
    9. protected:
    10. void mousePressEvent(QMouseEvent *event);
    11. void mouseMoveEvent(QMouseEvent *event);
    12. void paintEvent(QPaintEvent *event);
    13. void enterEvent(QEvent *event);
    14. void leaveEvent(QEvent *event);
    15. void keyPressEvent(QKeyEvent *event);
    16. public:
    17. PieDialog(QWidget *parent = 0);
    18. };
    19. PieDialog::PieDialog(QWidget *parent /* = 0 */)
    20. : QDialog(parent)
    21. {
    22. m_Color[0] = Qt::red;
    23. m_Color[1] = Qt::green;
    24. m_Color[2] = Qt::blue;
    25. m_Color[3] = Qt::cyan;
    26. m_Color[4] = Qt::magenta;
    27. m_Color[5] = Qt::yellow;
    28. m_Color[6] = Qt::darkYellow;
    29. m_Color[7] = Qt::darkRed;
    30. m_Color[8] = Qt::darkGreen;
    31. m_Color[9] = Qt::darkCyan;
    32. qMemSet(m_Result, 0, sizeof(m_Result));
    33. setWindowTitle("Pie Dialog");
    34. setFixedSize(400, 300);
    35. //让程序背景透明
    36. setWindowFlags( Qt::FramelessWindowHint );
    37. setAttribute(Qt::WA_TranslucentBackground, true);
    38. }
    39. void PieDialog::mousePressEvent(QMouseEvent *event)
    40. {
    41. //按住左键可以托动窗口
    42. if(event->button() == Qt::LeftButton)
    43. {
    44. m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
    45. event->accept();
    46. }
    47. QDialog::mousePressEvent(event);
    48. }
    49. void PieDialog::mouseMoveEvent(QMouseEvent *event)
    50. {
    51. if (event->buttons() && Qt::LeftButton)
    52. {
    53. move(event->globalPos() - m_CurrentPos);
    54. event->accept();
    55. }
    56. QDialog::mouseMoveEvent(event);
    57. }
    58. void PieDialog::keyPressEvent(QKeyEvent *event)
    59. {
    60. //按数字键1-0相当于投票
    61. for(int i=0; i<10; i++)
    62. {
    63. if( Qt::Key_0+i == event->key() )
    64. {
    65. m_Result[i]++;
    66. break;
    67. }
    68. }
    69. update();
    70. QDialog::keyPressEvent(event);
    71. }
    72. void PieDialog::paintEvent(QPaintEvent *event)
    73. {
    74. QPainter painter(this);
    75. //反走样
    76. painter.setRenderHint(QPainter::Antialiasing, true);
    77. int cy = 10;
    78. //先画出颜色图解
    79. for(int i=0; i<10; i++)
    80. {
    81. painter.setBrush( m_Color[i] );
    82. painter.drawRect(320, cy, 30, 20);
    83. painter.drawText( QPoint(360, cy+15), QString::number(i) );
    84. cy += 28;
    85. }
    86. painter.setPen( QPen(Qt::black, 1) );
    87. const int FULL_CIRCLE = 5760;
    88. const int RADIUS = 140;
    89. QRect rect(10, 10, 280, 280);
    90. int count = 0;
    91. for(int i=0; i<10; i++)
    92. {
    93. count += m_Result[i];
    94. }
    95. //如果还没有投过票,那就先画一个白色的圆形
    96. if( 0 == count )
    97. {
    98. painter.setBrush( Qt::white );
    99. painter.drawEllipse(rect);
    100. return;
    101. }
    102. int pos = 0;
    103. int angle;
    104. for(int i=0; i<10; i++)
    105. {
    106. if( 0 == m_Result[i] )
    107. continue;
    108. painter.setBrush( m_Color[i] );
    109. double persent = (double)m_Result[i] / count;
    110. angle = FULL_CIRCLE * persent;
    111. //画出各个对应的扇形
    112. double abc = 3.14 * 2 * (double)(pos + angle/2) / FULL_CIRCLE;
    113. double tx = 100 * qCos(abc) + 10 + RADIUS;
    114. double ty = -100 * qSin(abc) + 10 + RADIUS;
    115. painter.drawPie(rect, pos, angle);
    116. //在扇形上写注释(投票数和百分比)
    117. QString temp;
    118. temp.sprintf(" (%d) ", m_Result[i]);
    119. painter.drawText(tx-20, ty-10, temp);
    120. temp.sprintf("%0.1lf%%", persent*100);
    121. painter.drawText(tx-20, ty, temp);
    122. pos += angle;
    123. }
    124. }
    125. void PieDialog::leaveEvent(QEvent *event)
    126. {
    127. //鼠标离开窗口时是普通的指针
    128. setCursor(Qt::ArrowCursor);
    129. }
    130. void PieDialog::enterEvent(QEvent *event)
    131. {
    132. //鼠标留在窗口上时是一个手指
    133. setCursor(Qt::PointingHandCursor);
    134. }
    135. #include "main.moc"
    136. int main(int argc, char *argv[])
    137. {
    138. QApplication app(argc, argv);
    139. PieDialog *dialog = new PieDialog;
    140. dialog->show();
    141. return app.exec();
    142. }

http://blog.csdn.net/small_qch/article/details/7607491

QT:浮动的饼状统计图(自绘不规则窗口)的更多相关文章

  1. 用canvas 绘制的饼状统计图、柱状统计图、折线统计图

    canvas 绘制的饼状统计图 canvas 绘制的柱状统计图 canvas 绘制的折线统计图

  2. 利用ajax做的柱状图,线性统计图,饼状图

    柱状图,两个不同类型的数据 以下是html页面代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  3. 使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP

    虽然现在JS做报表和图形展示已经非常普遍和漂亮了,但是不能忽略有jfreechart 这样一种东西! 这些翻阅资料,在看以前写的示例时发现了关于jfreechart 的简单示例,不管怎样发上来分享一下 ...

  4. Qt数据可视化(散点图、折线图、柱状图、盒须图、饼状图、雷达图)开发实例

    ​  目录 散点图 折线图 柱状图 水平柱状图 水平堆叠图 水平百分比柱状图 盒须图 饼状图 雷达图 Qt散点图.折线图.柱状图.盒须图.饼状图.雷达图开发实例. 在开发过程中我们会使用多各种各样的图 ...

  5. 用CAShapeLayer实现一个简单的饼状图(PieView)

    自己写了一个简单的PieView,demo在这里:https://github.com/Phelthas/LXMPieView 效果如图: 参考了https://github.com/kevinzho ...

  6. D3.js 饼状图的制作

    1.数据 有如下数据,需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终 ...

  7. C#绘制立体三维饼状图

    转载自原文 C#绘制立体三维饼状图(超酷) 内容原文地址:LINK [翻译]Julijan Sribar著3D Pie Chart一个用于绘制立体三维饼状图的C#类库[简介]本文的想法就是创建一个独立 ...

  8. canvas图表详解系列(3):动态饼状图(原生Js仿echarts饼状图)

    本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...

  9. canvas学习之饼状图

    接着上一节说,这次我使用canvas绘制了饼状图,主要是SectorGraph.js, 引入 import {canvasPoint} from '../../assets/js/canvas';im ...

随机推荐

  1. Typecho 代码阅读笔记(三) - 插件机制

    转载请注明出处:http://blog.csdn.net/jh_zzz 以 index.php 为例: /** 初始化组件 */ Typecho_Widget:: widget('Widget_Ini ...

  2. 动态加载JS过程中如何判断JS加载完成

    在正常的加载过程中,js文件的加载是同步的,也就是说在js加载的过程中,浏览器会阻塞接下来的内容的解析.这时候,动态加载便显得尤为重要了,由于它是异步加载,因此,它可以在后台自动下载,并不会妨碍其它内 ...

  3. QObject就有eventFilter,功能很强(随心所欲的进行处理,比如用来QLineEdit分词)

    相信大家都用过词典吧!因为英语不太好...O(∩_∩)O~,所以经常进行划词翻译! 简述 实现 效果 源码 更多参考 实现 原理:鼠标移至某单词之上,获取鼠标位置,然后在对应位置进行取词,翻译! 基于 ...

  4. SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

    原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Se ...

  5. Linux下ld搜索问题:ld: cannot find -l"XX"

    ld命令行工具(链接库的一个工具)的搜索路径是-L指定的,库名是-l指定的. 比如: ld -L[dir] -l[mylib] --verbose 以上我用可视化的方法显示ld的搜索路径,其结果是居然 ...

  6. javaWeb Cache技术――OSCache(转-全)

    什么是osCache? 它是:http://baike.baidu.com/view/1835163.htm?fr=aladdin OSCache使用指南 一.下载安装 OSCache是一个基于web ...

  7. Luci流程分析(openwrt下)

    1. 页面请求: 1.1. 代码结构 在openwrt文件系统中,lua语言的代码不要编译,类似一种脚本语言被执行,还有一些uhttpd服务器的主目录,它们是: /www/index.html cgi ...

  8. UESTC_冰雪奇缘 CDOJ 843

    艾莎女王又开始用冰雪魔法盖宫殿了. 她决定先造一堵墙,于是释放魔法让形为直角梯形的冰砖从天而降,定入冻土之中. 现在你将回答女王的询问:某段冻土上冰砖的面积. 注:多块冰砖之间会互相重叠,重叠部分要多 ...

  9. 基于redis AE异步网络架构

    最近的研究已redis源代码,redis高效率是令人钦佩. 在我们的linux那个机器,cpu型号, Intel(R) Pentium(R) CPU G630 @ 2.70GHz  Intel(R) ...

  10. Android多媒体开发-- OpenMax IL简介

    1.openmax 简介 http://www.khronos.org/openmax/ OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出. OpenM ...