最近一直在外面出差,孩子的英语和语文课后的听写作业就没法继续了,所以就给他写了个小程序,把所有的语文和英语词组都记录下来,然后从里面随机抽取进行朗读听写。
先上图
整体界面和代码参考了Qt5.8的实例,在实例的基础上添加了读取文本,在一个范围内生成多少个随机数,多线程实现了语音播放的停顿。
1、读取文本
void DxThreadObject::readFile(QString filePath)
{
QFile file(filePath);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
}
QTextStream in(&file);
QTextCodec::ConverterState state;
if(!in.atEnd())
{
const QByteArray ba = file.read(file.bytesAvailable());
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QString lineStr = codec->toUnicode(ba.constData(), ba.size(), &state);
int ninvalidChars = state.invalidChars;
if(ninvalidChars > 0)
in.setCodec("GBK");
else
in.setCodec("UTF-8");
}
m_textList.clear();
in.seek(0);
while(!in.atEnd())
{
QString line = in.readLine().toUtf8();
m_textList.push_back(line);
}
}
2、生成随机数
QList<int> DxThreadObject::randValues(int minValue, int maxValue, int randCount)
{
QList<int> valList;
// m_maxOutValue m_minOutValue 分别代表范围值的最大值和最小值
double diff = abs(maxValue - minValue); // 求浮点数绝对值
QTime time;
for (int i=0,m=0; m!=randCount; i++) {
time = QTime::currentTime();
qsrand(time.msec()*1000 + time.second() * 1000 *1000);
double dtmp = (float)(qrand() % 100) / 100;
int randoxNumber = minValue + dtmp * diff;
// 判断生成的随机数 在约定范围内,则追加到容器中
if(minValue <= randoxNumber && randoxNumber <= maxValue) {
//判断随机数是否存在容器中
if(!valList.contains(randoxNumber))
{
valList.push_back(randoxNumber);
m++;
}
}
}
return valList;
}
3、线程中实现文本朗读的停顿
for(int i=0; i<size; i++)
{
if(valList.contains(i))
{
QString txt = m_textList.at(i);
if(num != 1)
QThread::sleep(txtCount);
emit signal_speak(txt);
emit signal_process(num);
num++;
}
}
4、代码地址
https://download.csdn.net/download/marquess/86946812