博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0...
阅读量:5996 次
发布时间:2019-06-20

本文共 7557 字,大约阅读时间需要 25 分钟。

作者:小波

QQ:463431476

请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 

我的第二款软件:CET四六级单词背诵软件。基于QT5.5.0、sql数据库、以及TTS文本识别语音单词朗读的一款软件。

 第一款软件的sql数据库软件的编写:http://www.cnblogs.com/xiaobo-Linux/p/4676950.html

 现在来讲解我的第二款高大上的代码:

这个是.pro的代码,其中axcontainer 是调用的win7 SDK语音库必须的;QT += sql 是引用sql数据库必须的;RC_FILE=icon.rc引用的ico图标文件必须的。

#-------------------------------------------------## Project created by QtCreator 2015-07-28T13:25:29##-------------------------------------------------QT       += core gui axcontainer #axcontainer speakQT += sql         #sqlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = CET_wordsTEMPLATE = appSOURCES += main.cpp\        mainwindow.cppHEADERS  += mainwindow.hFORMS    += mainwindow.uiRC_FILE=icon.rc   #ico

 

说起调用系统语音实现TTS也就是text to speech 文本识别成语音朗读,Qt调用win7系统语音库的话可能还得安装SDK语音库,这里附上win7官网sdk下载地址:

http://www.microsoft.com/en-us/download/details.aspx?id=10121

这里选择如图所示:

 下载完后才发现本程序可能不需要。不过最好 下载好并解压后安装。

 

第二个是主窗口头文件mainwindow.h的代码。有引用的数据库的头文件:#include <QSqlDatabase>  #include <QSqlQuery>  #include <QSqlRecord>;

时间的头文件QTimer用于时间停顿;windows.h好像用不着也可以调用系统sleep()函数来时间停顿。QSqlDatabase db;      //声明数据库类 用于sql数据库  #include <QAxObject>  和 QAxObject * voiceObj  是调用win7系统SDK语音库的接口。

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include 
#include
//speak com#include
//数据库类#include
//执行语句类#include
//返回记录类#include
#include
#include
#include
#include
#include
#include
#include "QDebug"//#include "windows.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow();private slots: void select(); void on_search_clicked(); void on_addword_clicked(); void on_speak_word_clicked(); void on_del_word_clicked(); void on_back_clicked(); void on_mouse_speak_word_clicked(); void on_revise_word_clicked();private: Ui::MainWindow *ui; QSqlDatabase db; //声明数据库类 QAxObject * voiceObj; //speak};#endif // MAINWINDOW_H

 

main代码:其中主要是实现了数据库CET的创建,然后又建立了一张CET的数据库表格。程序开启后CET数据库以及CET表格都会自动建立。

#include "mainwindow.h"#include 
int main(int argc, char *argv[]){ QApplication a(argc, argv); //创建DB文件,创建表格 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); std::cout<<"begin sqlite"<

下面介绍主要的代码mainwindow.cpp

先介绍一下怎么实现语音TTS朗读的吧,我认为这个比较好玩。但也是很简单的。其次就是sql数据库的使用了。

TTS实现朗读的代码:

SAPI:

voiceObj = new QAxObject("sapi.spvoice",this);

然后再利用这个代码就搞定了:

voiceObj->dynamicCall()函数。 里面的 speak()函数。
voiceObj->dynamicCall("speak(1)", model->data(model->index(i,j)).toString());

一个时间停顿的函数:

头文件:#include“Qtimer.h”

QTime t;             t.start();             while(t.elapsed()< ui->spEveryWord->value()*1000 ) //时间停顿             {             QCoreApplication::processEvents();             }

对于对数据库表依次的朗读,利用for循环与tableview结合进行数据库的遍历。这里详见另外一篇博客:http://www.cnblogs.com/xiaobo-Linux/p/4684671.html

void MainWindow::on_speak_word_clicked()
 
{
QSqlQueryModel *model = new QSqlQueryModel(ui->tableView);
 
model->setQuery(QString("select *from CET"));
 
//遍历model中的所有数据
for(int i=0;i
rowCount();i++) //model->rowCount()获取model的行数
{
for( int times = ui->spReadTimes->value();times>0;times-- ) //读单词次数
{
 
QTime t;
t.start();
while(t.elapsed()< ui->spEveryWord->value()*1000 ) //时间停顿
{
QCoreApplication::processEvents();
}
 
 
for(int j=1;j
columnCount();j++) //model->columnCount()获取model的列数
{
 
voiceObj->dynamicCall("speak(1)", model->data(model->index(i,j)).toString());
}
}
}
}

主要的代码:

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    setWindowTitle("小波的CET单词背诵 V1.0");    setWindowIcon(QIcon("xiaobo.ico"));//设置软件图标    select();//显示表格    voiceObj = new QAxObject("sapi.spvoice",this);}MainWindow::~MainWindow(){    delete ui;    db.close();}void MainWindow::on_addword_clicked(){    QSqlQuery query;    query.prepare("insert into CET (id,word,mean)values(1,:word,:mean )"); //id自动增加,先从1起,之后无需手动插入    query.prepare("insert into CET (word,mean)values(:word ,:mean )");    query.bindValue(":word",ui->textEdit_1->text());    query.bindValue(":mean",ui->textEdit_2->text());    query.exec();    select();//显示表格}void MainWindow::on_search_clicked(){         QSqlQuery query;         ui -> tableView -> clearSpans(); //tableview清空         QSqlQueryModel *model = new QSqlQueryModel(ui->tableView);         query.prepare("select  *from CET where word = :word ");  // like 模糊查询没成功         query.bindValue(":word",ui->textEdit_3->text());         query.exec();          model->setQuery(query);          model->setHeaderData(0,Qt::Horizontal,QObject::tr("顺序"));          model->setHeaderData(1,Qt::Horizontal,QObject::tr("单词"));          model->setHeaderData(2,Qt::Horizontal,QObject::tr("释义"));          ui->tableView->setModel(model);}void MainWindow::select(){  //将sql表格显示到tableView里 QSqlQueryModel *model = new QSqlQueryModel(ui->tableView); model->setQuery(QString("select *from CET")); model->setHeaderData(0,Qt::Horizontal,QObject::tr("顺序")); model->setHeaderData(1,Qt::Horizontal,QObject::tr("单词")); model->setHeaderData(2,Qt::Horizontal,QObject::tr("释义")); ui->tableView->setModel(model);}void MainWindow::on_speak_word_clicked(){     QSqlQueryModel *model = new QSqlQueryModel(ui->tableView);     model->setQuery(QString("select *from CET"));  //遍历model中的所有数据     for(int i=0;i
rowCount();i++) //model->rowCount()获取model的行数 { for( int times = ui->spReadTimes->value();times>0;times-- ) //读单词次数 { QTime t; t.start(); while(t.elapsed()< ui->spEveryWord->value()*1000 ) //时间停顿 { QCoreApplication::processEvents(); } for(int j=1;j
columnCount();j++) //model->columnCount()获取model的列数 { voiceObj->dynamicCall("speak(1)", model->data(model->index(i,j)).toString()); } }}}void MainWindow::on_del_word_clicked(){ QSqlQuery query; int curRow = ui->tableView->currentIndex().row(); //鼠标选择删除第几行 QModelIndex index = ui->tableView->currentIndex(); int id = index.sibling(curRow,0).data().toInt(); query.prepare("delete from CET where id = :id"); query.bindValue(":id",id); query.exec(); select();}void MainWindow::on_back_clicked(){ select();}void MainWindow::on_mouse_speak_word_clicked(){ for( int times = ui->spReadTimes->value();times>0;times-- ) //读单词次数 { voiceObj->dynamicCall("speak(1)",ui->tableView->currentIndex().data()); //鼠标选中tableview单元格内数据来朗读 QTime t; t.start(); while(t.elapsed()< ui->spEveryWord->value()*1000 ) //时间停顿 { QCoreApplication::processEvents(); } }}void MainWindow::on_revise_word_clicked(){ QSqlQuery query; int row = ui->tableView->currentIndex().row(); //鼠标选择第几行 QModelIndex index = ui->tableView->currentIndex(); int id = index.sibling(row,0).data().toInt(); query.prepare("update CET set word =:word where id= :id "); query.bindValue(":id",id); query.bindValue(":word",ui->textEdit_5->text()); query.exec(); query.prepare("update CET set mean =:mean where id= :id "); query.bindValue(":id",id); query.bindValue(":mean",ui->textEdit_4->text()); query.exec(); select();}

 

mainwindow。ui的界面设计:

 

代码的演示部分:

 

视频演示:

http://files.cnblogs.com/files/xiaobo-Linux/%E5%B0%8F%E6%B3%A2%E7%9A%84CET%E5%8D%95%E8%AF%8D%E8%83%8C%E8%AF%B5%E8%BD%AF%E4%BB%B6%E8%A7%86%E9%A2%91%E6%BC%94%E7%A4%BA.zip

 

 软件的发布版本:http://pan.baidu.com/s/1mgrIMwC

你可能感兴趣的文章
.NET Core2使用Azure云上的Iot-Hub服务
查看>>
Models of good programmer
查看>>
使用swoole编写简单的echo服务器
查看>>
信息系统管理师读书笔记之第5章 面向对象方法
查看>>
Django搭建后篇——启动服务器及创建视图
查看>>
Luogu4149 [IOI2011]Race
查看>>
关于Webpack详述系列文章 (第二篇)
查看>>
报表中经常遇到的一个头疼的问题是需要自动选择过去一个月的数据作为当前报表输出。网上查询了一些.NET 的C#例子,发现都实现的比较复杂...
查看>>
win7 安装 visual studio 2010 失败
查看>>
RTP QOS
查看>>
javascript for循环
查看>>
Hive之 hive-1.2.1 + hadoop 2.7.4 集群安装
查看>>
模论笔记1|习题与抄书笔记
查看>>
jQuery 添加元素
查看>>
Android解析
查看>>
MySQL 查询某一字段为数字的数据
查看>>
椭圆伸缩之思考
查看>>
PHP全栈开发(八):CSS Ⅶ 表格 style
查看>>
git 笔记
查看>>
极验滑动验证码的识别
查看>>