CONFIG += qaxcontainer注意以上两个问题之后在编写代码时应该就不会出现什么问题了,我在使用QT4.8时无法找到QAxObject,如果出现这个问题的大概跟我一样是安装QT时出了问题,我卸载后重新完整安装了QT5.0之后这个问题得到了解决,下面开始介绍代码。我的类名为TextSpeech。因为我只需要部分函数,所以我在程序中没有使用原文中提到的所有函数,剩下的函数stop(),pause(),reseum()三个主要函数的原理相同#ifndef TEXTSPEECH_H#define TEXTSPEECH_H#include <QObject>#include<QAxObject>class TextSpeech : public QObject{Q_OBJECTpublic:explicit TextSpeech(QObject *parent = 0);~TextSpeech();bool initSpeech();//初始化函数bool speak(QString txt);//文本转语音函数void setRate(int rate);//设置语速,范围-10到10void setVolume(int value);//设置音量,范围 0到100bool isSpeaking();private:QAxObject _voice;bool _binit;bool _bReading;signals:void speakComplete();private slots:void dealevent(QString name, int arc , void* argv);};#endif // TEXTSPEECH_H#include "textspeech.h"TextSpeech::TextSpeech(QObject *parent) :QObject(parent),_binit(0),_bReading(0){initSpeech();//初始化语音}TextSpeech::~TextSpeech(){}bool TextSpeech::initSpeech(){if(_binit)return true;_binit = this->_voice.setControl("96749377-3391-11D2-9EE3-00C04F797396");//设置COM的名称用来初始化COM的模型,返回是否加载成功if(_binit){connect(&this->_voice,SIGNAL(signal(QString, int, void*)), this, SLOT(dealevent(QString, int, void*)));}return _binit;}//文本转语音朗读函数bool TextSpeech::speak(QString txt){if(!_binit)return false;int result = this->_voice.dynamicCall("Speak(QString, SpeechVoiceSpeakFlags)", txt ,1).toInt();//执行第一个参数的方法名,以第二个参数返回是否执行成功_bReading = true;return result;//返回是否执行阅读函数}//判断语音系统是否运行函数bool TextSpeech::isSpeaking(){return _bReading;}//设置语音朗读速度-10到10void TextSpeech::setRate(int rate){if(!_binit)return;this->_voice.dynamicCall("SetRate(int)", rate);}//设置语音音量0到100void TextSpeech::setVolume(int value){if(!_binit)return;this->_voice.dynamicCall("SetVolume(int)", value);}void TextSpeech::dealevent(QString name, int arc , void* argv){if(name == "EndStream(int,QVariant)"){_bReading = false;emit speakComplete();}}完成以上代码的编写,你就可以在别的类中申请该类的对象,调用该类的speak函数传入你需要朗读的文本就可以实现中英文混读了。代码中的关于函数或者代码段到的注释也是我阅读帮助文档后按自己理解注释的,所以建议大家还是去阅读原来的英文帮助文档,我也是新手,所以对于程序理解有误的地方希望指出。下面我上传我的测试工程下载地址,在main.cpp中调用的该类的speak函数,供大家测试使用:
新闻热点
疑难解答