Qt浅谈之七:抽奖软件(可显示图片和姓名)

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、简介

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

二、运行图

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

Qt浅谈之七:抽奖软件(可显示图片和姓名)

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

Qt浅谈之七:抽奖软件(可显示图片和姓名)

三、详解

1、文件规则

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

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

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

Qt浅谈之七:抽奖软件(可显示图片和姓名)

void MyLoterry::display(bool flag)
{
  //qDebug() << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz ddd");
  QString image_jpg;
  QString image_png;
  QString image;
  int size = nameList.size();
  int winner = (qrand()%size);
  ui->label_name->setText(nameList[winner]);
  image_jpg = dir + "/" + nameList[winner] + ".jpg";
  image_png = dir + "/" + nameList[winner] + ".png";
  QFile file_jpg(image_jpg);
  QFile file_png(image_png);
  // 以只读方式打开
  if (!file_jpg.open(QIODevice::ReadOnly)) {
    if (!file_png.open(QIODevice::ReadOnly)) {
      ui->label_picture->setText(nameList[winner]);
      if (flag == true) {
        nameList.removeAt(winner);
      }
      update();
      return;
    }
    else {
      image = image_png;
    }
  }
  else {
    image = image_jpg;
  }
  //...
  update();
}

2、初始化设置

MyLoterry::MyLoterry(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyLoterry)
{
    ui->setupUi(this);
    dir = "";
    ui->Btn_Start->setEnabled(false);
    ui->lineEdit_dir->setEnabled(false);
    ui->label_name->setStyleSheet("font-size:20px;color:green");
    ui->label_picture->setStyleSheet("font-size:80px;color:red;font-weight: bold;");
    resize(500, 550);
    move((QApplication::desktop()->width() - width())/2,
               (QApplication::desktop()->height() - height())/2);
    setWindowIcon(QIcon(":/images/icon.ico"));

    /*构建定时器*/
    timer=new QTimer();
    timer->setInterval(ui->spinBox->value() * 10);
    connect(timer,SIGNAL(timeout()), this, SLOT(display()));
    qsrand(QTime::currentTime().msec());
}

初始化中涉及label的样式、窗口的大小图标、显示的位置和定时器。包括文字显示的颜色、大小和粗细。

3、定时器

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

void MyLoterry::on_Btn_Start_clicked()
{
  if (nameList.size() == 0) {
    QMessageBox::information(this,tr("提示对话框"),tr("已无人参加抽奖!"),QMessageBox::Ok);
    ui->Btn_Start->setEnabled(false);
    ui->label_name->clear();
    ui->label_picture->clear();
    return;
  }
  if (ui->Btn_Start->text() == tr("开始")) {
    ui->Btn_Start->setText(tr("停止"));
    timer->start();
  }
  else if (ui->Btn_Start->text() == tr("停止")) {
    ui->Btn_Start->setText(tr("开始"));
    timer->stop();
    display(true);
  }
}

定时器是该软件的重点,是文字和图片显示跳动的依据。也有coder会新开启一个线程,该线程中处理图片文字的显示,并设置标志位来停止线程的运行。主要考虑到线程不太容易控制时间,只能添加sleep语句。

4、中奖者

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

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

int winner = (qrand()%size);

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

5、说明向导

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

void MyLoterry::on_pushButton_clicked()
{
  WizardPage *wizard = new WizardPage(this);
  wizard->exec();
  delete wizard;
}
class WizardPage : public QWizard
{
public:
    explicit WizardPage(QWidget *parent = 0);
private:
    QWizardPage *createPageOne(); //新添加
    QWizardPage *createPageTwo(); //新添加
    QWizardPage *createPageThree(); //新添加
};

每个页面作为一个窗口,可以在其上添加自己的控件和布局。


Qt浅谈之七:抽奖软件(可显示图片和姓名)

四、总结

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

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

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

(4)若需要沟通可以联系yang.ao@i-soft.com.cn

patch1

       图片显示的变形问题

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

{
  QPixmap pic = QPixmap(image);
  if(pic.width() > ui->label_picture->width() || pic.width() > ui->label_picture->height()) {
    ui->label_picture->setScaledContents(true);
    pic = pic.scaled(ui->label_picture->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
  }
  else {
      ui->label_picture->setScaledContents(false);
  }
}

patch2

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179574.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Tomcat学习—Tomcat7 修改/webapps/ROOT发布路径(Linux和windows环境)

    在web开发中经常使用到的一个容器就是Tomcat,大多数人在本地开发使用的是windows 环境,而当项目真正远行,一般就是在Linux服务器上。下面主要讲解Linux服务器上修改Tomcat部署应用程序的发布路径! 现在应用服务器上用的笔记多的还是Tomcat7,就以Tomcat为例!Tomcat7和之前的版本一样,默认发布程序是在$Tomcat/webapp/ROOT 下面,就是当我们启动T

    2022年2月24日
    126
  • 海贼王

    海贼王★海贼王简介  日本国民级超人气动漫作品《ONEPIECE》,简称OP(1997-现在)  【原名】ONEPIECE——十多年来日本的统治级漫画,单行本十年销量冠军,初版销量已超1亿5千8百万册,09年4月再版销量1千7百万册,总销量1亿7500万册,成为日本史上漫画单行本销量最高和初版销量最高的纪录最快到本书一亿保持者,本书销量第一。  【译名】海贼王、航海王、海盗路飞

    2022年7月12日
    50
  • android10锁屏时钟样式,三星s10息屏时钟[通俗易懂]

    android10锁屏时钟样式,三星s10息屏时钟[通俗易懂]三星s10息屏时钟设置软件相当的方便强大,是不是设置息屏时钟太麻烦了,或者横竖屏总是错乱不尽人意?不用再在网上找各种攻略啦,这款软件可以直接帮助你修改息屏时钟,一键操作设置即可!同时这款软件中还有这更多的炫酷功能,图标壁纸时钟主题等等自定义和制作功能相当的强大!喜欢的朋友们不要错过哦!赶快下载三星s10息屏时钟开始体验吧!三星s10息屏时钟介绍三星s10息屏时钟软件app是一款提取版三星s10息屏…

    2022年9月29日
    5
  • windows lua_windows创建指定大小的文件

    windows lua_windows创建指定大小的文件首先我在D:\downloadSoftware\lua-5.3.5_Win64_bin目录下创建了一个hello.lua的文件,文件内容如图,是一个简单的lua程序。运行这个文件有两种方式。第一种:进入cmd命令行,然后进入源文件的目录下执行命令luachello.lua(后面的是文件名),可以看到当前目录下生成了一个文件hello.out,这是源文件编译好了,然后执行命令lua…

    2025年5月26日
    5
  • origin2021安装教程【附详细图文教程+安装包】

    origin2021安装教程【附详细图文教程+安装包】originpro2021是一款功能非常强大的数据分析软件,它支持处理信号处理,数据处理,统计信息,图形和报告等功能,各位可以将需要分析的数据导入至软件中,它目前支持ASCII、Excel、NITDM、DIADem、NetCDF、SPC等类型的数据文件,软件内为各位用户准备了查询工具可以直接访问数据库数据,并且支持将存储在数据库的文件直接导入至工作表中,这样可以保护数据的安全,保证数据完整等。在最新推出的originpro2021中为各位带来了很多更加优秀的功能,比如全新的颜色管理器,用户可以使用这

    2022年6月12日
    183
  • ADRC学习笔记( 一)[通俗易懂]

    ADRC学习笔记( 一)[通俗易懂]近期正在自学自抗扰技术,不得不感叹韩老师乃神人也!话不多说先把这两天的学习成果与大家分享,后续在做详细的介绍。欢迎大家批评指正。(1)过渡过程输入一个阶跃信号,其跟踪效果如图所示,可以看到毫无超调。(2)扩张状态观测器(3)非线性组合(4)整个控制器结构最后附上学习的资料,需要的小伙伴自取,simulink仿真和matalb仿真代码也会陆续分享出来,敬请关注。自抗扰学习资料…

    2022年5月12日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号