学习感受(年会抽奖程序)

  公司年会,老大让我写一个抽奖程序,就两个页面,蛮简单的嘛。整个程序都是用Qt写的,以前学过一点,但很久没有写过了。那天下班到家,吃过饭,九点了。打开电脑,写代码。话说,挺长时间没有写代码了,写代码的感觉还挺爽的。控件叫什么,信号和槽,都不知道怎么写了,幸好有以前的代码做参照。大概在十二点钟,我完成了抽奖程序。

  其中遇到一个坑,我新添加了一个类,但是没有在类的开始加 Q_OBJECT,所以。。。

  Q_OBJECT 是Qt里的一个宏,使用信号和槽机制,必须要写这个宏。(使用信号和槽机制的类,必须继承至QObject类,我也是才知道。对于信号和槽机制,我使用QPushButton和timer比较多,都是Qt类,Qt中的大部分类都继承QObject类。)虽然学过的东西会忘,但捡起来更容易。

  第二天,又是一顿改,细节就不赘述了。很麻烦,我们说说对代码的体会吧。

  在给界面加背景时,每一个控件,有这个背景,难看程度自己脑补吧。界面控件不多,但是我用的相对布局,里面加了很多QWidget填充,如果给每个QWidget设置变量名,在设置透明,这就太麻烦了。于是想到了继承,于是出现了下下面的代码:

class Widget : public QWidget
{
public:
   Widget();
private:
   QWidget * m_widget;     
};

Widget::Widget()
{
  m_widget = new QWidget();
  m_widget->setAttribute(Qt::WA_TranslucentBackground);   
}

  在Qt中,我们大量的使用了new,但却很少delete。因为Qt使用QObject对象管理内存,无需我们手动释放,只需将对象继承于QObject,指定父类,Qt就会自动释放内存。

这里又遇到一个坑,抽奖程序有两个界面,每次抽奖结束,我都要关闭一个界面,但是这个界面的内存没有释放。多次抽奖,就会出现内存泄漏的问题。

我第一个想到的是强制释放这个页面的内存,通过添加如下代码:

this->setAttribute(Qt::WA_DeleteOnClose);

  结果程序挂掉了,Qt是基于c++的,所以,它一定是符合c++的语法规范的。虽然两个类都是继承与QMainWindow,但也不应该释放一个类,另一个类也被释放啊,这根本不符合逻辑。早上去公司的路上,我突然想到Qt的内存管理,我强行释放子类,那么子类一定会释放父类,最顶层的QObject就会把整个程序的内存释放掉,程序也就异常退出了。最后,我是通过单利模式的方法实现的,也不知道是先想到方法,还是先想到的单例模式。(其实很多时候,都是我们想的不到位而已。在遇到问题时,我们应该想为什么会这样,而不是这样不对)。

  在抽奖界面,有一些gif动画,有的一直在页面上,有的只有在中奖时才会显示。这里都是相对布局,所以有些控件会串动。我想通过绝对位置来定位,但是考虑到要移植到别的电脑,绝对位置不是好办法。于是百度找如何固定控件,如何在相对位置上移动,不知道Qt有没有这些功能,反正我没有找到。最终还是通过布局解决的。(有时做的很难,可能是我们的方法不对。)

  中奖号码是随机的,话说,如果一个人中两次就尴尬了,虽然概率很小。于是需要一个数组,存放中奖号码,没次将中奖号码和数组中的数字比较,如果不存在就将号码放到数组中,如果存在,就在生成一个中奖号码,重复上诉动作。本来这里定义一个中奖号码个数的数组就好了,但我想到了哈希表,于是我定义了一个全体号码的数组,也不大,通过下标来查找。

  中奖号码不能重复,可是如果中间程序被误关了,或者多按了抽奖。那不是有出问题的风险。我们还得把数据写到文件里,每次启动程序加载文件。我使用了QSettings这个类,Qt中专门用来读写配置文件的类。以前封装过这个类,为了简单,直接拷过来用。话说,自己挖的坑,还得自己填。之前只用QString类的函数,这次使用的是int类的函数。(我还很确信我的代码没问题,这就尴尬了。。。)

  翻看以前的代码,都会张嘴骂一句,哪个傻逼写的。

  代码注释很重要,结构清晰很重要。

posted @ 2017-01-18 22:31  Covit  阅读(1314)  评论(0编辑  收藏  举报