简易课堂点名系统(带语音)
一、名单文件导入
QString path = QFileDialog::getOpenFileName(this,tr("打开文件"),".",tr("Text Files(*.csv)"));
// qDebug() << path;
if(!path.isEmpty())
{
QFile file(path);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::warning(this, tr("读文件"),
tr("Cannot open file:\n%1").arg(path));
return;
}
int i = 0; // 相对索引
file.readLine(); // 跳过标题
while(!file.atEnd())
{
QString strAll = file.readLine();
QStringList strList = strAll.split(",");
if (!strList[0].isEmpty())
{
std::pair<QString, QString> pairTempInfo(strList[0], strList[1]);
map_info[i++] = pairTempInfo;
}
}
file.close();
}
else
{
QMessageBox::warning(this, tr("文件路径"),
tr("你没有选择文件"));
}
二、随机数生成
bool Widget::getRandNum(int *a,int n,int min,int max) //获取[min-max]之间不重复的n个随机数保存到数组a中
{
int i,j,t,m = 0,flag;
srand(time(nullptr)); //随机数种子函数
for(i=0; i<n; i++) //循环n次得到n个随机数
{
while(1)
{
flag = 0; //进入while(1),标志位置0
t = rand()%(max - min + 1) + min; //rand()%5得到 [0-4) 之间的随机数,因此rand()%(max - min + 1)可以得到[0 - (max - min + 1) )之间的随机数。再加上min 就能得到 [min - max]之间的随机数
for(j=0; j<m; j++) //第一次m = 0,不执行循环语句
{
if(a[j] == t) //新生成的随机数只要和数组中的元素重复
{
flag = 1; // flag 置1
break; //一旦找到一个重复的,直接跳出for循环
}
}
if(flag == 0) //第一次flag = 0
{
a[m++] = t; //生成的随机数和数组中已有的元素不重复时,保存到数组中。
break; //跳出while循环,继续获得后面的随机数
}
}
}
return 0;
}
三、语音功能
void Widget::on_pushButton_call_clicked()
{
m_speech.pause();
int arr[100] = {0}; // 一个班级的学生上限是100个
getRandNum(arr, map_info.size(), 0, map_info.size() - 1);
m_speech.say("本次抽到的五位同学分别是:");
for (int i = 0; i < 5; i++)
{
QString strLineData = QString("%1、%2").arg(++m_nNumber).arg(map_info[arr[i]].first);
ui->textEdit->append(strLineData);
// ui->textEdit->textCursor().movePosition(QTextCursor::StartOfLine);
QString strSpeechData = QString("%1%2%3").arg(m_nNumber).arg("号").arg(map_info[arr[i]].first);
m_speech.say(strSpeechData);
}
m_speech.say("请做好准备!");
}
四、运行效果