QT:浮动的饼状统计图(自绘不规则窗口)
昨天在玩手机游戏时,见到一个游戏的饼状投票统计图很漂亮,所以我今天也花了一个下午来实现了一个类似的程序娱乐一下,呵呵。
思路:
1:将窗体设为Qt::FramelessWindowHint和Qt::WA_TranslucentBackground(去掉标题栏,背景透明)。
2:重载程序的鼠标事件(移动程序)和键盘事件(模拟投票和退出)。
3:根据投票结果,在paintEvent函数中画几个扇形和其他东西。
操作说明:
1:按数字键0-9模拟投票。
2:按ESC键退出程序。
运行时截图(浅绿色的是桌面背景):

源代码:
- #include <QtGui>
- class PieDialog : public QDialog
- {
- Q_OBJECT
- private:
- int m_Result[10];
- QColor m_Color[10];
- QPoint m_CurrentPos;
- protected:
- void mousePressEvent(QMouseEvent *event);
- void mouseMoveEvent(QMouseEvent *event);
- void paintEvent(QPaintEvent *event);
- void enterEvent(QEvent *event);
- void leaveEvent(QEvent *event);
- void keyPressEvent(QKeyEvent *event);
- public:
- PieDialog(QWidget *parent = 0);
- };
- PieDialog::PieDialog(QWidget *parent /* = 0 */)
- : QDialog(parent)
- {
- m_Color[0] = Qt::red;
- m_Color[1] = Qt::green;
- m_Color[2] = Qt::blue;
- m_Color[3] = Qt::cyan;
- m_Color[4] = Qt::magenta;
- m_Color[5] = Qt::yellow;
- m_Color[6] = Qt::darkYellow;
- m_Color[7] = Qt::darkRed;
- m_Color[8] = Qt::darkGreen;
- m_Color[9] = Qt::darkCyan;
- qMemSet(m_Result, 0, sizeof(m_Result));
- setWindowTitle("Pie Dialog");
- setFixedSize(400, 300);
- //让程序背景透明
- setWindowFlags( Qt::FramelessWindowHint );
- setAttribute(Qt::WA_TranslucentBackground, true);
- }
- void PieDialog::mousePressEvent(QMouseEvent *event)
- {
- //按住左键可以托动窗口
- if(event->button() == Qt::LeftButton)
- {
- m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
- event->accept();
- }
- QDialog::mousePressEvent(event);
- }
- void PieDialog::mouseMoveEvent(QMouseEvent *event)
- {
- if (event->buttons() && Qt::LeftButton)
- {
- move(event->globalPos() - m_CurrentPos);
- event->accept();
- }
- QDialog::mouseMoveEvent(event);
- }
- void PieDialog::keyPressEvent(QKeyEvent *event)
- {
- //按数字键1-0相当于投票
- for(int i=0; i<10; i++)
- {
- if( Qt::Key_0+i == event->key() )
- {
- m_Result[i]++;
- break;
- }
- }
- update();
- QDialog::keyPressEvent(event);
- }
- void PieDialog::paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- //反走样
- painter.setRenderHint(QPainter::Antialiasing, true);
- int cy = 10;
- //先画出颜色图解
- for(int i=0; i<10; i++)
- {
- painter.setBrush( m_Color[i] );
- painter.drawRect(320, cy, 30, 20);
- painter.drawText( QPoint(360, cy+15), QString::number(i) );
- cy += 28;
- }
- painter.setPen( QPen(Qt::black, 1) );
- const int FULL_CIRCLE = 5760;
- const int RADIUS = 140;
- QRect rect(10, 10, 280, 280);
- int count = 0;
- for(int i=0; i<10; i++)
- {
- count += m_Result[i];
- }
- //如果还没有投过票,那就先画一个白色的圆形
- if( 0 == count )
- {
- painter.setBrush( Qt::white );
- painter.drawEllipse(rect);
- return;
- }
- int pos = 0;
- int angle;
- for(int i=0; i<10; i++)
- {
- if( 0 == m_Result[i] )
- continue;
- painter.setBrush( m_Color[i] );
- double persent = (double)m_Result[i] / count;
- angle = FULL_CIRCLE * persent;
- //画出各个对应的扇形
- double abc = 3.14 * 2 * (double)(pos + angle/2) / FULL_CIRCLE;
- double tx = 100 * qCos(abc) + 10 + RADIUS;
- double ty = -100 * qSin(abc) + 10 + RADIUS;
- painter.drawPie(rect, pos, angle);
- //在扇形上写注释(投票数和百分比)
- QString temp;
- temp.sprintf(" (%d) ", m_Result[i]);
- painter.drawText(tx-20, ty-10, temp);
- temp.sprintf("%0.1lf%%", persent*100);
- painter.drawText(tx-20, ty, temp);
- pos += angle;
- }
- }
- void PieDialog::leaveEvent(QEvent *event)
- {
- //鼠标离开窗口时是普通的指针
- setCursor(Qt::ArrowCursor);
- }
- void PieDialog::enterEvent(QEvent *event)
- {
- //鼠标留在窗口上时是一个手指
- setCursor(Qt::PointingHandCursor);
- }
- #include "main.moc"
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- PieDialog *dialog = new PieDialog;
- dialog->show();
- return app.exec();
- }
http://blog.csdn.net/small_qch/article/details/7607491
QT:浮动的饼状统计图(自绘不规则窗口)的更多相关文章
- 用canvas 绘制的饼状统计图、柱状统计图、折线统计图
canvas 绘制的饼状统计图 canvas 绘制的柱状统计图 canvas 绘制的折线统计图
- 利用ajax做的柱状图,线性统计图,饼状图
柱状图,两个不同类型的数据 以下是html页面代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- 使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP
虽然现在JS做报表和图形展示已经非常普遍和漂亮了,但是不能忽略有jfreechart 这样一种东西! 这些翻阅资料,在看以前写的示例时发现了关于jfreechart 的简单示例,不管怎样发上来分享一下 ...
- Qt数据可视化(散点图、折线图、柱状图、盒须图、饼状图、雷达图)开发实例
目录 散点图 折线图 柱状图 水平柱状图 水平堆叠图 水平百分比柱状图 盒须图 饼状图 雷达图 Qt散点图.折线图.柱状图.盒须图.饼状图.雷达图开发实例. 在开发过程中我们会使用多各种各样的图 ...
- 用CAShapeLayer实现一个简单的饼状图(PieView)
自己写了一个简单的PieView,demo在这里:https://github.com/Phelthas/LXMPieView 效果如图: 参考了https://github.com/kevinzho ...
- D3.js 饼状图的制作
1.数据 有如下数据,需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终 ...
- C#绘制立体三维饼状图
转载自原文 C#绘制立体三维饼状图(超酷) 内容原文地址:LINK [翻译]Julijan Sribar著3D Pie Chart一个用于绘制立体三维饼状图的C#类库[简介]本文的想法就是创建一个独立 ...
- canvas图表详解系列(3):动态饼状图(原生Js仿echarts饼状图)
本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...
- canvas学习之饼状图
接着上一节说,这次我使用canvas绘制了饼状图,主要是SectorGraph.js, 引入 import {canvasPoint} from '../../assets/js/canvas';im ...
随机推荐
- Java程序员需要学习的知识点
Java是全世界最受欢迎的3大编程语言之一,它可以开发出许多实用的WEB应用程序和桌面应用程序,更重要的一点,Java是跨平台的语言——编写一次,可以再任何地方运行.另外,Java也很容易入门,如果你 ...
- TENX_ASM.uew
/L14"TENX ASM" Nocase Line Comment = ; File Extensions = INC ASM LST H /Colors = ,,,,, /Co ...
- 创业不要在IT业内创(市场太小,而且都喜欢自己折腾、没有花钱的习惯)
精神是好的.但是,我看了你的产品和网站:你选的创业方向基本是死路一条,我劝你该放弃就放弃.我判断你的思路还局限在IT行业内,创业不要在IT业内创,要走出去,睁开眼看看别人的世界,自己体会.我不是打击你 ...
- SQL Server 2005中的分区表(五):添加一个分区
所谓天下大事,分久必合,合久必分,对于分区表而言也一样.前面我们介绍过如何删除(合并)分区表中的一个分区,下面我们介绍一下如何为分区表添加一个分区. 为分区表添加一个分区,这种情况是时常会 发生的.比 ...
- java 下拉框级联及相关(转)
ActionLintsner都实现此接口,其它监听器可以监听的事件都可以被它捕获 public interface ActionListener extends EventListenerThe li ...
- tomcat j2ee 目录结构
一.TOMCAT的目录结构 /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和w ...
- Why Functional Programming Matters
http://hi.baidu.com/lhurricane/item/35b57e12a1e3c5ddbf9042a7 http://blog.csdn.net/ddwn/article/detai ...
- java List与数组互转
数组转List:String[] arr = new String[] {"str1", "str2"};List<String> list = A ...
- UESTC_方老师的分身 II CDOJ 915
方老师的分身 II Time Limit: 10000/5000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Python re模块 正则表达式
1 简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...