基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
作者:小波
QQ:463431476
请关注我的博客园:http://www.cnblogs.com/zhaocundang/
我的第二款软件:CET四六级单词背诵软件。基于QT5.5.0、sql数据库、以及TTS文本识别语音单词朗读的一款软件。
第一款软件的sql数据库软件的编写:http://www.cnblogs.com/zhaocundang/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 speak QT += sql #sql greaterThan(QT_MAJOR_VERSION, 4): 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: 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 <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!")); return 0; } 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(); 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<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(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<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()); } } } } 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的界面设计:
代码的演示部分: