照例演示一下:
分享一个简易的Qt点名程序,满打满算一百行代码(还要什么自行车)。
UI界面比较丑,按钮是自己做的,背景是AI作画生成的,大家可以自行更换背景以及按钮。
内容也是非常的简单,就是一个点名的程序,当然了,你要改成什么今晚吃什么之类的那也是可以的。
背景图片:
重写主窗口的绘图事件,在窗口初始化的时候系统会自动执行一边,所以我们在绘图事件里把背景图片贴上去,也比较简单,不多说,直接参考下面的代码:
void RollCall::paintEvent(QPaintEvent* e) {
QPainter* pain = new QPainter(this);
QPixmap background;
QPixmap nameback;
nameback.load(":/image/nameback.png");
background.load(":/image/background.png");
background = background.scaled(800, 500, Qt::KeepAspectRatio);
nameback = nameback.scaled(800, 80);
pain->drawPixmap(0, 0, background);
pain->drawPixmap(0, 130, nameback);
pain->end();
}
点名花名册:
那既然要点名,就要花名册,而我们不能把数据写死在程序里,因此我们可以使用读取文件的方式来获取花名册(要改成从数据库里获取也是可以的)。
程序一开始如果找不到花名册,则需要提示找不到文件,并且要退出程序,否则会发生异常,因为根本没有名单,那我们还点什么名。
读取文件直接使用Qt的QFile(本来是就打算用C++原生的文件操作的,但是和Qt配合的话,类型转换有些麻烦,因此直接用Qt的文件操作类 )。
判断文件是否读取成功,如果读取失败我们就弹出一个模态对话框,在对话框被关闭后,直接关闭程序。
然后我这里设定的是文件里一行就是一个人名(这样比较省事,要改成用空格隔开的话也行,另外再在这边改改就行)。
然后每读取一行(一个人名),就存到程序的一个QVector里。
void RollCall::initNames() { //获取名单,存入到程序里的缓存中
QFile input("./names.txt");
if (!input.exists()) {
QDialog* d = new QDialog(this);
d->setFixedSize(500, 200);
QLabel* l = new QLabel(QString::fromLocal8Bit("找不到对应的 names.txt 文件\n请配置好对应文件"), d);
d->exec();
exit(0);
}
input.open(QIODevice::ReadOnly);//只读模式
QString name;
while (!input.atEnd()) {//判断是否读到文件尾
name = input.readLine(); //按行读,追加
qDebug() << name << endl;
names.append(name);
}
input.close();
}
抽个幸运儿:
我们直接搞一个QLabel来把抽到的人名放上去,为了模拟出动态抽取的效果,我们要在按下暂停键之前,每隔一小段时间就更新一下显示的名字,直到按下暂停键就停止抽取效果,所以我们使用定时器,我这里设定的是每20ms抽一次,所以就是一秒抽50次,具体可以根据情况来修改。
void RollCall::timerEvent(QTimerEvent* event) { //定时器任务
std::uniform_int_distribution<int>u(0, names.size() - 1); //生成随机数
QString checkedPeople = names[u(e)]; //随机抽取一个名单里的名字
luckydog->setText(checkedPeople); //修改QLabel里的文字
}
然后我们是使用按钮来控制是否开启定时器(抽取效果),并且如果按钮是“开始”,那么按下之后按钮就要变成“暂停”,如果按下前是“暂停”,那么按下之后就要变成“开始 ”。
void RollCall::initButton() { //初始化按钮
QPushButton* begin = new QPushButton(this);
begin->setIcon(QIcon(":/image/begin.png"));
begin->move(350, 300);
begin->resize(100, 80);
begin->setIconSize(QSize(100, 80));
connect(begin, &QPushButton::clicked, [=] {
if (startFlag) {
startFlag = false;
begin->setIcon(QIcon(":/image/begin.png")); //切换按钮
killTimer(TimerID); //关闭定时器
}
else {
startFlag = true;
begin->setIcon(QIcon(":/image/stop.png")); //切换按钮
TimerID = startTimer(20); //开启定时器
}
});
}
小结:
主要的功能就这些,菜单栏的部分可有可无,我这里就不多赘述了。
可以根据自己的需求来修改。
完整的代码可以直接在CSDN免费下载,我已经上传到CSDN了。
也可以关注我的微信公众号:折途想要敲代码,回复“qt点名”免费领取。