前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >08 qt进程和网络编程(cs模型)

08 qt进程和网络编程(cs模型)

作者头像
天天Lotay
发布2023-10-15 18:35:23
3040
发布2023-10-15 18:35:23
举报
文章被收录于专栏:嵌入式音视频

一 、qt进程

qt中进程最主要的任务就是启动额外应用程序 并且跟他们之间通信。进程类为QProcess

定义

用途

Header:

#include

qmake:

QT += core

Inherits:

QIODevice//继承于IO设备类

1.1 QProcess基本使用

第一步:创建一个QProcess对象

代码语言:javascript
复制
// process = new QProcess(this); //说明启动的额外的应用程序与当前qt应用程序是依赖关系
process = new QProcess;//说明启动的额外的应用程序与当前qt应用程序是无依赖关系,可以脱离你独立运行

第二步:将要执行的应用 程序名字或者路径+应用 程序名字,做为start函数的参数即可

代码语言:javascript
复制
void MainWindow::on_startButton_clicked()
{
  // process->start("C:/Users/PC/Desktop/FeiQ.exe"); //ok
   process->start("notepad"); //额外应用程序notepad就相当于process
}
1.2 启动多个的额外应用程序

常用接口:

  1. 启动应用程序

定义

用途

void

start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

void

start(const QString &command, QIODevice::OpenMode mode = ReadWrite)

void

start(QIODevice::OpenMode mode = ReadWrite)

参数说明:

  • const QString &program ----- 启动的应用程序名,最好加路径
  • const QString &command ----> 启动的命令
  • const QStringList &arguments ----> 启动应用程序时,需要设置的参数列表
  1. 设置要启动的应用 程序和参数

定义

用途

void

setProgram(const QString &program)

void

setArguments(const QStringList &arguments)

以上两个接口,结合void start(QIODevice::OpenMode mode = ReadWrite)一起使用

  1. 让程序进入阻塞状态

定义

用途

bool

waitForFinished(int msecs = 30000)

bool

waitForStarted(int msecs = 30000)

Blocks until the process has finished and the finished() signal has been emitted, or until msecs milliseconds have passed.

  1. 杀死进程

定义

用途

void

kill()//杀掉进程

它通常跟void waitForFinished(int msecs = 30000)

  1. 进程运行状态

定义

用途

QProcess::ProcessState

state() const//获取当前进程所运行状态

QProcess::ProcessState

定义

数值

用途

QProcess::NotRunning

0

The process is not running.

QProcess::Starting

1

The process is starting, but the program has not yet been invoked.

QProcess::Running

2

The process is running and is ready for reading and writing.

代码语言:javascript
复制
void MainWindow::on_notepadButton_clicked()
{
    if(QProcess::Running == process->state())
    {
        process->kill();
        process->waitForFinished();
    }
    process->start("notepad");
}

void MainWindow::on_calcButton_clicked()
{
    if(QProcess::Running == process->state())
    {
        process->kill();
        process->waitForFinished();
    }
   process->start("calc");
}

void MainWindow::on_qtButton_clicked()
{
    if(QProcess::Running == process->state())
    {
        process->kill();
        process->waitForFinished();
    }
   process->start("C:/Users/PC/Desktop/Lucky_draw.exe");
}
1.3 进程间数据传输

因为QProcess类继承于QIODevice,它也是一种io设备,那么,它也可以读取数据 QIODvice常用信号:

定义

用途

void

readyRead()//当QProcess有数据可以读取时,会发送这个信号

用户想要读取它的数据时,只需要跟该信号建立信号和槽,在槽函数时,可以 通过readAll()读数据, 因为该信号只相当于一个通知,并不传输数据

定义

用途

QByteArray

read(qint64 maxSize)

QByteArray

readAll()

基本实现:

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    process = new QProcess;

    //当proces进程有数据可读取时,那么它会自动发送一个信号 readyRead()
    connect(process,&QProcess::readyRead,this,&MainWindow::readData);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readData()
{
    qDebug() << "------";
  QByteArray data = process->readAll();
  qDebug() << data;
}

void MainWindow::on_startButton_clicked()
{
       process->start("ipconfig");
}

二 qt网络编程

网络软件协议:

  • 网络大致分为两种模型:OSITCP/IP
  • OSI:七层: 应用 表示 会话 传输 网络 数据链路 物理层
  • TCP/IP:四层:应用 传输 网络 物理层
  • 应用层:http ftp
  • 传输:TCP UDP
  • 网络:IP

在QT中,对于网络编程,也是采用模块化管理

代码语言:javascript
复制
To link against the Qt Network module, add this line to the project file(.pro):
  QT += network // 在当前工程中,增加网络,工程中才可以 使用网络接口API
2.1 TCP网络通信

TCP通信是基于C/S模型

  • C---- 客户端
  • S ---- 服务端

客户端和服务端之间通信以3次握手,建立边连接后,才开始发送数据 在Qt客户端和服务端分别使用来封装

客户端:

定义

用途

QTcpSocket

TCP socket

服务端:

定义

用途

QTcpServer

TCP-based server

在客户端与服务端通信之间,服务端必须先开启。

QTcpSocket— 客户端

定义

用途

Header:

#include

qmake:

QT += network //在pro文件中所要增加的 模块

Inherits:

QAbstractSocket//基类

客户端的实现步骤: 第一步:创建客户端对象 第二步:根据ip地址和端口号,向服务器发起连接

定义

用途

virtual void

connectToHost(const QString &hostName, quint16 port, QIODevice::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

virtual void

connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)

代码语言:javascript
复制
const QString &hostName  ------ 》服务端的ip地址
quint16 port -----》服务端的端口号
const QHostAddress &address ------》服务端的主机对象,通用使用ip地址做为字符串参数,再使用构造函数来完成该对象的创建QHostAddress(const QString &address)

第三步:和服务器进行通信:读或者写

读:

定义

用途

qint64

read(char *data, qint64 maxSize)

QByteArray

read(qint64 maxSize)

QByteArray

readAll()

写:

定义

用途

qint64

write(const char *data, qint64 maxSize)

qint64

write(const char *data)qint

64write

(const QByteArray &byteArray)

思考:客户端什么时候要进行数据读取 ----- 信号和槽

定义

用途

void

readyRead()

当客户端有数据读取时,也会发送一个信号,只需要建立该信号和槽连接,在槽中进行数据读取

服务端— QTcpServer

定义

用途

Header:

#include

qmake:

QT += network//使用类所要增加的模块

Inherits:

QObject//基类

服务端实现步骤: 第一步:创建一个服务端对象 第二步:调用listen来监听是否用新的客户端来进行连接—listen()

代码语言:javascript
复制
bool QTcpServer::
listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

参数说明: 参数一:const QHostAddress &address = QHostAddress::Any — 所有网络设备 参数二:quint16 port ---- 跟客户端保持一致端口号 第三步:当有新的客户端来进行连接时,服务端会发出一个信号:newConnection() 第四步:在服务端建立与newConnection()信号相关的槽函数:newClient(); 第五步:在槽函数中,调用nextPendingConnection()得到新的连接客户端对象

代码语言:javascript
复制
QTcpSocket *QTcpServer::nextPendingConnection()

第六步:可以进行服务端和连接上客户端之间的数据传输:读和写 写操作:直接调用write写 读操作:当客户端写入数据过来时,连接上来的客户端也会发送一个信号:readyRead(),也建立与该信号相关的槽函数来完成从客户端读取数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 、qt进程
    • 1.1 QProcess基本使用
      • 1.2 启动多个的额外应用程序
        • 1.3 进程间数据传输
        • 二 qt网络编程
          • 2.1 TCP网络通信
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档