使用QLocalSocket与Python进行进程间通讯

在树莓派上界面程序使用Qt编写,设备会使用到一个USB-LCD的液晶显示屏,USB-LCD的显示程序使用python编写,因此考虑使用socket进行两个进程间的通讯

QLocalSocket类提供了一个本地socket。

在Windows中,这是一个命名管道;在Unix中,这是一个本地网域socket。

在打开连接之前必须调用setServerName();或者可以使用connectToServer(const QString &name, OpenMode openMode)。

以指定的openMode打开socket,首先进入ConnectingState,如果建立了连接,QLocalSocket进入ConnectedState,并发射connected()信号。

调用此函数后,当发生错误时,socket会发射error()信号。

python端建立服务端时需要指定socket路径,Qt中QLocalSocket初始化时仅指定socket名称,路径固定使用/tmp/,所以python绑定时指定/tmp/路径的socket名称即可。

代码示例如下:

Qt:

lcdmodel::lcdmodel(QObject *parent) : QObject(parent)
{
    socket=new QLocalSocket(this);
    connect(socket,SIGNAL(readyRead()),this,SLOT(readData()));
           connect(socket,SIGNAL(error(QLocalSocket::LocalSocketError)),this,SLOT(displayError(QLocalSocket::LocalSocketError)));
    socket->connectToServer("lcdsock");
}

void lcdmodel::readData()
{
}

void lcdmodel::displayError(QLocalSocket::LocalSocketError err)
{
    switch (err) {
    case QLocalSocket::ServerNotFoundError:
        qDebug()<<tr("The host was not found. Please check the host name and port settings.");
        break;
    case QLocalSocket::ConnectionRefusedError:
        qDebug()<<tr("The connection was refused by the peer. Make sure the server is running.");
        break;
    case QLocalSocket::PeerClosedError:
        qDebug()<<tr("The server was closed.");
    default:
        qDebug()<<tr("The following error occurred: %1.").arg(socket->errorString());
        break;
    }
}

Python:

from socket import *
import os
from lcd2usb import LCD

lcd=LCD()
lcd.goto(0,0)
lcd.write('>>              ')
sock_file='/tmp/lcdsock'
if os.path.exists(sock_file):
    os.remove(sock_file)

sockfd=socket(AF_UNIX,SOCK_STREAM)

sockfd.bind(sock_file)

sockfd.listen(3)
while True:
    c,addr=sockfd.accept()
    while True:
        data=c.recv(1024)
        if not data:
            break
        lcd.goto(0,1)
        info=data.decode()
        print(info)
        l=len(info)
        print(l)
        infolcd=info.rjust(16)
        lcd.write(infolcd)
        print(infolcd)
    c.close()
sockfd.close()

测试效果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值