一 、qt进程
qt中进程最主要的任务就是启动额外应用程序 并且跟他们之间通信。进程类为QProcess
定义 | 用途 |
---|---|
Header: | #include |
qmake: | QT += core |
Inherits: | QIODevice//继承于IO设备类 |
1.1 QProcess基本使用
第一步:创建一个QProcess
对象
// process = new QProcess(this); //说明启动的额外的应用程序与当前qt应用程序是依赖关系
process = new QProcess;//说明启动的额外的应用程序与当前qt应用程序是无依赖关系,可以脱离你独立运行
第二步:将要执行的应用 程序名字或者路径+应用 程序名字,做为start
函数的参数即可
void MainWindow::on_startButton_clicked()
{
// process->start("C:/Users/PC/Desktop/FeiQ.exe"); //ok
process->start("notepad"); //额外应用程序notepad就相当于process
}
1.2 启动多个的额外应用程序
常用接口:
- 启动应用程序
定义 | 用途 |
---|---|
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 ----> 启动应用程序时,需要设置的参数列表
- 设置要启动的应用 程序和参数
定义 | 用途 |
---|---|
void | setProgram(const QString &program) |
void | setArguments(const QStringList &arguments) |
以上两个接口,结合void start(QIODevice::OpenMode mode = ReadWrite)一起使用
- 让程序进入阻塞状态
定义 | 用途 |
---|---|
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.
- 杀死进程
定义 | 用途 |
---|---|
void | kill()//杀掉进程 |
它通常跟void waitForFinished(int msecs = 30000)
- 进程运行状态
定义 | 用途 |
---|---|
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. |
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() |
基本实现:
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网络编程
网络软件协议:
- 网络大致分为两种模型:
OSI
和TCP/IP
- OSI:七层: 应用 表示 会话 传输 网络 数据链路 物理层
- TCP/IP:四层:应用 传输 网络 物理层
- 应用层:http ftp
- 传输:TCP UDP
- 网络:IP
在QT中,对于网络编程,也是采用模块化管理
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) |
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()
bool QTcpServer::
listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
参数说明:
参数一:const QHostAddress &address = QHostAddress::Any — 所有网络设备
参数二:quint16 port ---- 跟客户端保持一致端口号
第三步:当有新的客户端来进行连接时,服务端会发出一个信号:newConnection()
第四步:在服务端建立与newConnection()信号相关的槽函数:newClient();
第五步:在槽函数中,调用nextPendingConnection()得到新的连接客户端对象文章来源:https://www.toymoban.com/news/detail-652039.html
QTcpSocket *QTcpServer::nextPendingConnection()
第六步:可以进行服务端和连接上客户端之间的数据传输:读和写
写操作:直接调用write写
读操作:当客户端写入数据过来时,连接上来的客户端也会发送一个信号:readyRead(),也建立与该信号相关的槽函数来完成从客户端读取数据文章来源地址https://www.toymoban.com/news/detail-652039.html
到了这里,关于08 qt进程和网络编程(cs模型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!