一 、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() |
基本实现:
代码语言: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网络编程
网络软件协议:
- 网络大致分为两种模型:
OSI
和TCP/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) |
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(),也建立与该信号相关的槽函数来完成从客户端读取数据