QT:抽奖软件(可显示图片和姓名)

一、简介

       使用Qt设计的一个抽奖软件,可以显示抽奖人员姓名和图片(无图片时只显示姓名),在Windows下和Linux下都能打包运行。可以设置图片滚动的频率。

二、运行图

(1)无图片运行如下图1所示。

QT:抽奖软件(可显示图片和姓名)_第1张图片

(2)有图片(作者两侄女)时运行如下图2所示。

QT:抽奖软件(可显示图片和姓名)_第2张图片

三、详解

1、文件规则

(1)可以点击说明查看规则。

(2)新建抽奖人员.txt文件,将抽奖人员名单写入,点击浏览按钮打开txt文件所在的目录。打开软件会读取txt文件人员名单,每次会删除已经中奖人员的文字,注意所有人员都中奖后这个文件会变成空文件,但只能程序退出后才回写到文件中。

(3)若要添加图片,将图片(暂判断.jpg和.png)复制到上述目录下,并以抽奖人员的名命名该图片文件,中奖即可一起显示。

QT:抽奖软件(可显示图片和姓名)_第3张图片

[cpp]  view plain  copy
  1. void MyLoterry::display(bool flag)  
  2. {  
  3.   //qDebug() << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz ddd");  
  4.   QString image_jpg;  
  5.   QString image_png;  
  6.   QString image;  
  7.   int size = nameList.size();  
  8.   int winner = (qrand()%size);  
  9.   ui->label_name->setText(nameList[winner]);  
  10.   image_jpg = dir + "/" + nameList[winner] + ".jpg";  
  11.   image_png = dir + "/" + nameList[winner] + ".png";  
  12.   QFile file_jpg(image_jpg);  
  13.   QFile file_png(image_png);  
  14.   // 以只读方式打开  
  15.   if (!file_jpg.open(QIODevice::ReadOnly)) {  
  16.     if (!file_png.open(QIODevice::ReadOnly)) {  
  17.       ui->label_picture->setText(nameList[winner]);  
  18.       if (flag == true) {  
  19.         nameList.removeAt(winner);  
  20.       }  
  21.       update();  
  22.       return;  
  23.     }  
  24.     else {  
  25.       image = image_png;  
  26.     }  
  27.   }  
  28.   else {  
  29.     image = image_jpg;  
  30.   }  
  31.   //...  
  32.   update();  
  33. }  

2、初始化设置

[cpp]  view plain  copy
  1. MyLoterry::MyLoterry(QWidget *parent) :  
  2.     QWidget(parent),  
  3.     ui(new Ui::MyLoterry)  
  4. {  
  5.     ui->setupUi(this);  
  6.     dir = "";  
  7.     ui->Btn_Start->setEnabled(false);  
  8.     ui->lineEdit_dir->setEnabled(false);  
  9.     ui->label_name->setStyleSheet("font-size:20px;color:green");  
  10.     ui->label_picture->setStyleSheet("font-size:80px;color:red;font-weight: bold;");  
  11.     resize(500, 550);  
  12.     move((QApplication::desktop()->width() - width())/2,  
  13.                (QApplication::desktop()->height() - height())/2);  
  14.     setWindowIcon(QIcon(":/images/icon.ico"));  
  15.   
  16.     /*构建定时器*/  
  17.     timer=new QTimer();  
  18.     timer->setInterval(ui->spinBox->value() * 10);  
  19.     connect(timer,SIGNAL(timeout()), this, SLOT(display()));  
  20.     qsrand(QTime::currentTime().msec());  
  21. }  
初始化中涉及label的样式、窗口的大小图标、显示的位置和定时器。包括文字显示的颜色、大小和粗细。

3、定时器

当点击开始按钮时,会打开定时器,定时器时间为显示频率乘以10,单位为ms。

[cpp]  view plain  copy
  1. void MyLoterry::on_Btn_Start_clicked()  
  2. {  
  3.   if (nameList.size() == 0) {  
  4.     QMessageBox::information(this,tr("提示对话框"),tr("已无人参加抽奖!"),QMessageBox::Ok);  
  5.     ui->Btn_Start->setEnabled(false);  
  6.     ui->label_name->clear();  
  7.     ui->label_picture->clear();  
  8.     return;  
  9.   }  
  10.   if (ui->Btn_Start->text() == tr("开始")) {  
  11.     ui->Btn_Start->setText(tr("停止"));  
  12.     timer->start();  
  13.   }  
  14.   else if (ui->Btn_Start->text() == tr("停止")) {  
  15.     ui->Btn_Start->setText(tr("开始"));  
  16.     timer->stop();  
  17.     display(true);  
  18.   }  
  19. }  
定时器是该软件的重点,是文字和图片显示跳动的依据。也有coder会新开启一个线程,该线程中处理图片文字的显示,并设置标志位来停止线程的运行。主要考虑到线程不太容易控制时间,只能添加sleep语句。

4、中奖者

每次启动定时器,会以当前时间的毫秒数为种子产生一个随机数来确定中奖者。

qsrand(QTime::currentTime().msec());

int winner = (qrand()%size);

ui->label_name->setText(nameList[winner]);

5、说明向导

介绍软件的使用,还是比较管用的。

[cpp]  view plain  copy
  1. void MyLoterry::on_pushButton_clicked()  
  2. {  
  3.   WizardPage *wizard = new WizardPage(this);  
  4.   wizard->exec();  
  5.   delete wizard;  
  6. }  
  7. class WizardPage : public QWizard  
  8. {  
  9. public:  
  10.     explicit WizardPage(QWidget *parent = 0);  
  11. private:  
  12.     QWizardPage *createPageOne(); //新添加  
  13.     QWizardPage *createPageTwo(); //新添加  
  14.     QWizardPage *createPageThree(); //新添加  
  15. };  
每个页面作为一个窗口,可以在其上添加自己的控件和布局。
QT:抽奖软件(可显示图片和姓名)_第4张图片

四、总结

(1)本博文只发布部分源码,读者可根据思路来进行定制。

(2)在不同的系统下可能还会有乱码出现,可修改程序实现,主要当初没考虑到国际化支持。

(3)发布程序(非源码)已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/7285311)。   

(4)若需要沟通可以联系[email protected]

patch1

       图片显示的变形问题

       以前图片太小了可能被拉伸,太大了可能被缩放,都会变形。现在进行了以下修改,图片太大时进行比例缩放,图片小时直接显示。如今仍很难适合所有的图片,因为图片缩放是根据label比例缩放的,只能适合一定长宽比例的图片,所以还得定制者自己选择图片并设置程序中的缩放比例。

[cpp]  view plain  copy
  1. {  
  2.   QPixmap pic = QPixmap(image);  
  3.   if(pic.width() > ui->label_picture->width() || pic.width() > ui->label_picture->height()) {  
  4.     ui->label_picture->setScaledContents(true);  
  5.     pic = pic.scaled(ui->label_picture->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);  
  6.   }  
  7.   else {  
  8.       ui->label_picture->setScaledContents(false);  
  9.   }  
  10. }  

patch2

      当第一次浏览完毕后,若再次打开浏览,打开文件失败时上次的窗口信息仍然存在。解决方法:在相应的位置加上清理函数。


你可能感兴趣的:(QT)