用QT制作一个抽奖器的总结

配置XML文件

加载抽奖信息需要一个合适的配置文件,我知道的除了记事本文件就只有xml文件了。果断选择后者的原因很简单,抽奖信息不是很大,而且可以定向查找和修改。

我一开始是打算完全使用QT自带的函数接口来完成xml文件的配置(包括修改xml文件)的,我首先找到的是QStreamReader及QStreamWriter这两个类,然而看原文档看了半天都只找到生成和解析xml文档而不能修改文档,后面又试了QDomDocument类应该可以修改文档,然而我看了半天试了N多次也没搞定。于是我还是选择去找外部的接口吧,根据老师的推荐很快找到了一段开源代码TinyXML。各种好用,反正最后成功的实现了想要的功能:解析xml,生成xml,修改xml。不过自己做的抽奖器要求也不是很高,TinyXML上还有很多好用的函数没有试。解析xml,生成xml:

 1     QFile file("lottor.xml");
 2
 3     //判断文件是否存在
 4     if (file.exists())
 5     {
 6         //加载xml文件
 7         TiXmlDocument *xml_doc = new TiXmlDocument();
 8         if (NULL==xml_doc)
 9         {
10             return false;
11         }
12         xml_doc->LoadFile("lottor.xml");
13         TiXmlElement* xml_numberlist = xml_doc->RootElement();
14
15         //找到对应子元素
16         TiXmlElement* child = xml_numberlist->FirstChildElement("number");
17
18         //循环加载全部子元素
19         while (child)
20         {
21             const char* number = child->GetText();
22             ui.listWidgetLottor->addItem(number);
23
24             child = child->NextSiblingElement("number");
25         }
26
27     }
28     else
29     {
30         TiXmlDocument xml_doc1;
31
32         // 添加XML声明
33         xml_doc1.LinkEndChild(new TiXmlDeclaration( "1.0", "GBK", "" ));
34
35         // 添加根元素
36         TiXmlElement * xml_numberlist = new TiXmlElement("numberlist");
37         xml_doc1.LinkEndChild(xml_numberlist);
38
39         // 添加number
40         TiXmlElement* xml_child = new TiXmlElement("NUMBER");
41         xml_numberlist->LinkEndChild(xml_child );
42
43         // 添加文档内容
44         xml_child->LinkEndChild( new TiXmlText("************"));
45
46         xml_doc1.SaveFile("lottor.xml");

修改xml:

 1     QString addNumber=ui.lineEditAdd->text();
 2     string gbkAddNumber=GBK::FromUnicode(addNumber);
 3
 4     //加载xml文件
 5     TiXmlDocument *xml_doc = new TiXmlDocument();
 6     if (NULL==xml_doc)
 7     {
 8         return false;
 9     }
10     xml_doc->LoadFile("lottor.xml");
11
12     //寻找对应子元素
13     TiXmlElement* xml_numberlist = xml_doc->RootElement();
14
15     //添加
16     TiXmlElement* xml_child = new TiXmlElement("number");
17     xml_numberlist->LinkEndChild(xml_child );
18     xml_child->LinkEndChild( new TiXmlText(gbkAddNumber));
19     xml_doc->SaveFile("lottor.xml");

关于定时器

一开始觉得定时器没什么用处,以为和windows api上面的Sleep()函数是一个道理。于是最开始,我打算用一个循环和Sleep()函数来实现抽奖列表的滚动。但是我错了,我发现这样并不能实现信息的实时更新,也就是说要等循环完之后才能显示信息,这显然不能实现滚动。这是我才明白定时器的作用,我的理解是,当定义一个timer后,它是从外部以给定的时间间隔来调用功能函数的,这样才能实现信息的实时更新,达到滚动的效果。代码:

 1 void dlglott::timerEvent( QTimerEvent * event )
 2 {
 3     //TiXmlDocument *xml_doc = new TiXmlDocument();
 4     //if (NULL==xml_doc)
 5     //{
 6     //    return false;
 7     //}
 8     //xml_doc->LoadFile("lottor.xml");
 9     //TiXmlElement* xml_numberlist = xml_doc->RootElement();
10
11     ////找到对应子元素
12     ////TiXmlElement* child = xml_numberlist->FirstChildElement("number");
13
14     ////循环加载全部子元素
15     //while (1)
16     //{
17     //    TiXmlElement* child = xml_numberlist->FirstChildElement("number");
18
19
20             const char* number = child->GetText();
21             ui.labelShow->setText(number);
22             //Sleep(1000);
23
24             lottorResult=(char*)number;
25
26             child = child->NextSiblingElement("number");
27             if(!child)
28             {
29                 child = xml_numberlist->FirstChildElement("number");
30             }
31     //}
32
33 }
34
35 int dlglott::OnbtnLott()
36 {
37     if(!workingStatu)
38     {
39         timer=startTimer(20);
40         workingStatu=true;
41     }
42     else
43     {
44         killTimer(timer);
45
46         ui.listWidgetResult->addItem(lottorResult);
47         workingStatu=false;
48     }
49
50
51
52     //循环加载全部子元素
53     //while (1)
54     //{
55     //    TiXmlElement* child = xml_numberlist->FirstChildElement("number");
56     //    while (child)
57     //    {
58     //        const char* number = child->GetText();
59     //         ui.listWidgetResult->addItem("rrr");
60     //        ui.labelShow->setText(number);
61     //        Sleep(1000);
62
63     //        child = child->NextSiblingElement("number");
64     //    }
65     //}
66     //while (child)
67     //{
68     //    const char* number = child->GetText();
69     //    ui.listWidgetLottor->addItem(number);
70
71     //    child = child->NextSiblingElement("number");
72     //}
73    /*ui.lineEditShow->insert("rrr");*/
74     //accept();
75     return 0;
76 }

其他

想来关键的点就这么点,不过还有很多细节,比如bool值的使用,构造函数的恰当利用。。。收获颇多,对编程有了更直观的感受,也有了更大的信心。

时间: 2024-08-08 05:21:54

用QT制作一个抽奖器的总结的相关文章

如何用C#快速制作一个播放器

如何用VS快速制作一个播放器 本程序环境: 系统windows7 工具vs2012 语言c# 具体步骤如下: 1.  添加windowsmedia palyer组件 打开视图->工具箱 右键单击常规->选择项->COM组件->Windows Media Palyer 如图所示 新建winForm项目,打开form就可以看见工具箱常规下面有Windows Media Palyer组件了,如下图所示: 2.  在Form中添加WindowsMedia Palyer.OpenFileDi

QT制作一个图片播放器

前言:使用qt制作了一个简单的图片播放器,可以播放gif.png等格式图片 先来看看播放器的功能(当然是很简陋的,没有很深入的设计): 1.点击图片列表中图片进行播放. 2.自动播放,播放的图片的间隔时间可以自己设定,时间的单位是秒. 3.自动播放的时候再点击图片列表会停止自动播放,保存当前播放的图片的顺序,再次点击自动播放的时候将从当前开始. 4.自动播放到最后一张图片的时候将会停止自动播放,再次点击自动播放的时候将会从第一张图片开始. 先上图看看具体功能: 说完功能我们聊聊制作思路和使用到的

使用qt制作一个简单的计算器

前言:今天使用qt制作了一个很简单的计算器,觉得挺有意思的,所以在这里跟大家分享一下. 这里先跟大家说说使用到的函数: 一.槽连接函数 connect(信号发送者,发送的信号,信号接收者,信号接收者的槽函数) //前面我有一篇文章已经介绍过槽函数的使用了,大家有兴趣可以看看,这里就不详细说了.  二.取出按钮中的字符 QString line = ui->pushButton1->text() //取出按钮pushButton1中的字符存放到line中 三.设置输入框中显示的内容 ui->

利用Qt制作一个helloworld

使用QT创建第一个 工程: 1.打开应用程序: 2.单击画面中间偏上的 New Project按钮.[要学习使用啊~,传说它的跨平台行很好,QQ就是用它编辑的.] 3.直接点击右下角的选择 按钮. 4.为我们的项目起一个名字,并 放在一个 路径下面.[可以点击设为默认路径,避免修改路径的繁琐] 5.下一步 6. 在基类中,点选下拉菜单调成QWidget,之后点击下一步. 修改后: 点击下一步. 7.点击完成. 8.在菜单栏中点击构建,并点击构建项目"Test". 9.然后在左下角点击查

Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的狙击手就是使用望远镜的一个例子,如图2-22所示.   图2-22  游戏中狙击手所看到的视图 制作望远镜的过程如下: (1)在Project视图里,创建一个C#脚本文件,命名为TelescopicView.打开这个脚本文件,并在里面添加下面的代码: 01     using UnityEngine

C#制作一个消息拦截器(intercept)1

首先,我们先要制作一个自定义Attribute,让他可以具有上下文读取功能,所以我们这个Attribute类要同时继承Attribute和IContextAttribute. 接口IContextAttribute中有两个方法需要实现 1.bool   IsContextOK(Context ctx, IConstructionCallMessage msg); 2.void  GetPropertiesForNewContext(IConstructionCallMessage msg); 简

C#制作一个消息拦截器(intercept)3

之前为InterceptAttribute的上下文环境添加了"Intercept"属性(InterceptProperty),正因为InterceptProperty继承了IContributeObjectSink,所以我们要实现GetObjectSink(),继而我们要创建一个继承ImessageSink的类来作为返回值. 这样就引发出了InterceptSink类的实现: public class InterceptSink : IMessageSink { private IMe

C#制作一个消息拦截器(intercept)4

ok,我们拦截器基本构造完成,接下来我来告诉大家如何去使用. 注意一个问题,object拦截器我们要拦截什么,那么我们就要在需要拦截的类上面做手脚了. 首先,创建我们需要被拦截的类. 然后,我们再对类进行相应的包装: 1.该类要标记InterceptAttribute属性 2.该类要继承ContextBoundObject,只有继承ContextBoundObject的类,vs才能知道该类需要访问Context,这样标记的InterceptAttribute才有效. /// <summary>

Qt制作Aero特效窗口

转载请注明链接与作者huihui1988 初学QT,边看书边自己做点小东西.最近突然心血来潮,想自己做个小巧点的,界面美观一点的备忘当桌面上.想了半天,发现VISTA/WIN7的Aero效果就不错,况且自己现在就在用WIN7.于是上网找了下QT制作Aero效果的方法.Google之后终于找到了函数和用法.于是做了一个简单的Aero特效窗口 以下是头文件和实现文件: [cpp] view plaincopy //qtwin.h #ifndef QTWIN_H #define QTWIN_H #in