基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
作者:小波
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 --28T13::
#
#-------------------------------------------------
QT += core gui axcontainer #axcontainer speak
QT += sql #sql
greaterThan(QT_MAJOR_VERSION, ): QT += widgets
TARGET = CET_words
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
RC_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 <QMainWindow>
#include <QAxObject> //speak com
#include <QSqlDatabase> //数据库类
#include <QSqlQuery> //执行语句类
#include <QSqlRecord> //返回记录类
#include <QtSql>
#include <QApplication>
#include <QMessageBox>
#include <iostream>
#include <QtDebug>
#include <QSpinBox>
#include <QTimer>
#include "QDebug"
//#include "windows.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
);
~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 <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建DB文件,创建表格
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
std::cout<<"begin sqlite"<<std::endl;
db.setDatabaseName("CET.db");
if ( !db.open()){
QMessageBox::critical(NULL, QObject::tr("Collection"), QObject::tr("failed to connect to database!"));
;
}
QSqlQuery query;
query.exec("create table CET (id integer PRIMARY KEY AUTOINCREMENT,word text,mean text)");
MainWindow w;
w.show();
return a.exec();
}
下面介绍主要的代码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();
) //时间停顿
{
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<model->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<model->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(,Qt::Horizontal,QObject::tr("顺序"));
model->setHeaderData(,Qt::Horizontal,QObject::tr("单词"));
model->setHeaderData(,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(,Qt::Horizontal,QObject::tr("顺序"));
model->setHeaderData(,Qt::Horizontal,QObject::tr("单词"));
model->setHeaderData(,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中的所有数据
;i<model->rowCount();i++) //model->rowCount()获取model的行数
{
;times-- ) //读单词次数
{
QTime t;
t.start();
) //时间停顿
{
QCoreApplication::processEvents();
}
;j<model->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();
).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()
{
;times-- ) //读单词次数
{
voiceObj->dynamicCall("speak(1)",ui->tableView->currentIndex().data()); //鼠标选中tableview单元格内数据来朗读
QTime t;
t.start();
) //时间停顿
{
QCoreApplication::processEvents();
}
}
}
void MainWindow::on_revise_word_clicked()
{
QSqlQuery query;
int row = ui->tableView->currentIndex().row(); //鼠标选择第几行
QModelIndex index = ui->tableView->currentIndex();
).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
基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0的更多相关文章
- 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档
对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...
- 清除SQL数据库文本字段中的回车、换行符的方法
清除SQL数据库中文本字段的回车.换行符的方法 清除回车符: update tableName set columnName = rtrim(ltrim(replace(columnName ,cha ...
- 【Beta】“北航社团帮”测试报告——小程序v2.0与网页端v1.0
目录 测试计划.过程和结果 后端测试--单元测试与覆盖率 后端测试--压力测试 展示部分数据 平均数据 前端测试--小程序v2.0 授权登录与权限检查 新功能的测试 兼容性测试 性能测试 前端测试-- ...
- 后台框架 FastAdmin V1.0.0.20200228 发布,为疫情防控作贡献
后台框架 FastAdmin V1.0.0.20200228 发布,为疫情防控作贡献 https://www.oschina.net/news/113694/fastadmin-1-20200228- ...
- J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1
我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...
- 基于Qt5.5.0的sql,C++备忘录软件的编写
我的第一个软件. 基于Qt5.5.0的 sql ,C++备忘录软件version1.0的编写 我用的Qt版本是5.5.0免配置编译器的版本,这里附上我使用的软件下载地址:http://download ...
- 【C#】SQL数据库助手类2.0(自用)
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- 跨服务器备注SQL数据库 分类: SQL Server 2015-03-05 08:52 227人阅读 评论(0) 收藏
任务:把服务器1上的SQL数据库自动备份到服务器2上,命名格式=数据库名+年月日+小时. 说明: 服务器2=>192.168.0.22 数据库名=>Book 共享文件夹路径:192.168 ...
- Microsoft-PetSop4.0(宠物商店)-数据库设计-Sql
ylbtech-DatabaseDesgin:Microsoft-PetSop4.0(宠物商店)-数据库设计-Sql DatabaseName:PetShop(宠物商店) Model:宠物商店网站 T ...
随机推荐
- java多线程-线程创建
Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: ...
- Oracle - ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 解决
java.sql.SQLException: Listener refused the connection with the following error: ORA-12505, TNS:list ...
- SVG Drawing Animation - SVG 绘制动画
一个小实验,探索 SVG 线图动画的使用情况,以前沿的展示形式呈现图形或网站元素的外观,模拟它们的加载.SVG 真的很强大,有许多创造性和可能性,使用 SVG 可以制作各种有趣的网站交互效果.今天这篇 ...
- angularjs 指令—— 绑定策略(@、=、&)
angularjs 指令—— 绑定策略(@.=.&) 引入主题背景:angular 的指令配置中的template可以直接使用硬编码写相应的代码,不过也可以根据变量,进行动态更新.那么需要用到 ...
- Web Audio API_基本概念
Audio Context 音频的工作环境.类比做化学实验,Audio Context 就是为我们提供各种仪器和材料的实验室(严格地来说制造这些仪器材料的方法和工具也一并提供了).通常来说做实验一间实 ...
- css中的background属性
第一次写博客,我就写写今天在编写网页的过程中,对background的两种运用,一是background中的线性渐变,对背景的渐变我其实是很少使用的,所以今天在写的时候我用css3的帮助手册,back ...
- JavaScript concat() 方法-连接两个或多个数组
一,定义和用法 concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 语法 arrayObject.concat(arrayX,arrayX,. ...
- Atitit。Web server Jetty9 使用 attilax 总结
Atitit.Web server Jetty9 使用 attilax 总结 1.1. 静态文件的资源1 1.2. Servlet使用1 1.3. code1 1.1. 静态文件的资源 WebAppC ...
- 为Autodesk Viewer添加自定义工具条的更好方法
上一篇文章中我介绍了使用Autodesk Viewer的UI API来给viewer添加自定义工具条的方法,看起来很简单是吧.不过有个问题,就是关于自定义工具条的信息(包括按钮的文本.图标.样式.ca ...
- Android中利用ViewHolder优化自定义Adapter的典型写法
利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...