zoukankan      html  css  js  c++  java
  • 基于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的界面设计:

    代码的演示部分:

  • 相关阅读:
    预备作业02:体会做中学(Learning By Doing)
    寒假作业01
    20210418第 237 场周赛(一)
    机器学习第七堂课20210415
    云计算与信息安全第七节课20210413
    操作系统第七堂课2021年0412内存管理基础
    机器学习第六堂课20210408
    云计算与信息安全第六节课20210406
    机器学习第五节课20210401
    云计算与信息安全第五堂课20210330
  • 原文地址:https://www.cnblogs.com/zhaocundang/p/4684827.html
Copyright © 2011-2022 走看看