【C++】C++ qt 与 python 简单进程通讯

前言


准备用 C++写一个简单的文字转语音的小东西,对 C++ qt 这个怎么弄不太清楚(现在看到 qt5.8 后有个叫 QTextToSpeech 的东西),发现 python 调用一些库来进行文字转语音的发声比较简单,准备用 python 来进行接受 C++信息,转成语音。

python 端


python 文字转语音还比较简单,导入 pyttsx3 这个库,然后调用一下就可以了。用的 socket 通讯,python 是作为服务端接受信息。

import socket               # 导入 socket 模块
import pyttsx3 as py3
port = '127.0.0.1' #定义ip
ip = 12345    #定义端口
#申请socket服务端对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)        # 创建 socket 对象
s.bind((ip, int(port)))        # 绑定端口
s.listen(5)               # 等待客户端连接
while True:
    print("> 服务成功开启,等待连接")
    client,addr = s.accept()     # 建立客户端连接
    data = client.recv(2048)     #一次最多接受2048个字节
    receive_data = data.decode('gb18030') #接受到的信息转成这个编码,这个编码范围广一些
    engine = py3.init()
    engine.say(receive_data)
    engine.runAndWait()
    client.close()

C++端


C++端作为客户端,发送消息给 python。

  1. 用的 VS2013 环境,其中要把 qt 的 web socket 模块加上。
  2. 在调用的地方加上 #include <QtNetwork/QtNetwork> 这是一个全局的,qtcpsocket 在里面。
  3. 可能需要在配置,链接器,输入中添加 Qt5Networkd. lib 这个库。

这么用的
头文件里面添加了个 QTcpSocket *m_tcpClient; 指针。

    QString english_word = mWordList[index].mWord;//得到英语文本信息;
    std::string res = english_word.toLocal8Bit().toStdString();//转成string类型;
    char *buff = const_cast<char *>(res.c_str());//转成char类型发送;
    m_tcpClient->close();//关闭之前在主程序初始化时写了m_tcpClient = new QTcpSocket(this);生成的一个m_tcpClient;这段代码就可以多次调用了;
    delete(m_tcpClient);//释放指针空间;
    m_tcpClient = new QTcpSocket(this);//新建对象;
    m_tcpClient->connectToHost(QHostAddress("127.0.0.1"), 12345);//建立链接;
    m_tcpClient->write(buff);//发送信号

C++端接受数据

接受数据填上一句这 m_tcpClient->waitForReadyRead(); 就可以了,下面是接收的代码

m_tcpClient->waitForReadyRead();
QByteArray data = m_tcpClient->readAll(); // 读取缓冲区数据
QString received_data = QString::fromUtf8(data.data(), data.size());

注意在这么用的时候,需要在. h 文件里面先创建一个 QTcpSocket *m_tcpClient 指针,在构造函数里面先生请下空间,然后在后面才可以直接 close -- m_tcpClient->close();

OK。