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函數,供大家測試使用:
新聞熱點
疑難解答