一、源码头文件#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QTcpServer #include QTcpSocket #include QHostAddress #include QFile #include QTimer #include QMessageBox #include QNetworkInterface QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); QStringList GetlocalIP(); private slots: void on_severRB_clicked();//选择作为服务器 void on_clientRB_clicked();//选择作为客户端 void on_StartBt_clicked();//启动服务器或链接客户端 void on_closeBt_clicked();//关闭服务器或断开客户端 void on_onlineUserList_doubleClicked(const QModelIndex index);//选择给哪个客户端发送数据 void on_autoCB_clicked(bool checked);//选择自动发送还是手动发送 void on_sendMsgBt_clicked();//发送信息 //服务器 void accept_connect();//与newconnection信号关联 void recv_data(); //接收数据 void auto_time_send();//定时器定时发送数据 void client_disconnect();//关联掉线信号 void connect_suc();//检测客户端连接成功信号 void on_clearRcvBt_clicked(); void displayError(QAbstractSocket::SocketError socketError); void on_clearSendBt_clicked(); private: Ui::MainWindow *ui; QTimer *mTimer;//定时发送数据 QTcpServer *mServer; QTcpSocket *mSocket; QVectorQTcpSocket* clients; //存储所有在线客户端容器 bool isServer;//标志位,true为服务器false为客户端 //保存接收和发送数据的字节数 quint64 recvSize; quint64 sendSize; qint16 onNum 0; bool isCheckServer;//判断是否选择了服务器 bool isCheckClient;//判断是否选择了客户端 }; #endif // MAINWINDOW_HC文件#include mainwindow.h #include ui_mainwindow.h MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); recvSize 0; sendSize 0; //获取本地ip QStringList localIP GetlocalIP(); ui-comboBox-addItems(localIP); //初始化定时器 mTimer new QTimer(); connect(mTimer,SIGNAL(timeout()),this,SLOT(auto_time_send())); } MainWindow::~MainWindow() { delete ui; } //与newconnection信号关联 void MainWindow::accept_connect() { mSocket mServer-nextPendingConnection(); //返回与客户端连接通信的套接字 //关联接收数据信号 connect(mSocket,SIGNAL(readyRead()),this,SLOT(recv_data())); //关联掉线信号 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_disconnect())); //上线用户添加到客户列表容器 clients.append(mSocket); //把用户添加到界面列表中 QString ip mSocket-peerAddress().toString().remove(::ffff:);//去除客户端中多余的字符 ui-onlineUserList-addItem(ip); //在线数量添加 onNum; ui-onlineUserCount-setText(QString::number(onNum));//显示在线数 } //接收数据 void MainWindow::recv_data() { QTcpSocket *obj (QTcpSocket*)sender(); //获取发送数据端的IP QString ip obj-peerAddress().toString(); ip.remove(::ffff:); QString msg obj-readAll(); ui-receiveList-addItem(ip:msg);//显示接收到的数据 recvSize msg.size();//统计接收到的数据的字节数 ui-receiveNumLabel-setText(QString::number(recvSize)); } void MainWindow::client_disconnect() { QTcpSocket *obj (QTcpSocket*)sender();//获取掉线对象 if(isServer) { int row clients.indexOf(obj);//找到掉线对象的内容所在的行 QListWidgetItem *item ui-onlineUserList-takeItem(row);//从界面列表中去除找到的一行内容 delete item; clients.remove(row);//从容器中删除对象 //掉线时删除在线数量 onNum--; ui-onlineUserCount-setText(QString::number(onNum)); } else { ui-StartBt-setEnabled(true);//断开连接的时候重新启用开始按钮 } } //客户端连接成功 void MainWindow::connect_suc() { ui-StartBt-setEnabled(false);//连接成功则禁用开始按钮 } //定时器定时发送数据 void MainWindow::auto_time_send() { quint64 len mSocket-write(ui-sendMsgEdit-toPlainText().toUtf8()); if(len 0) { sendSize len;//统计发送的字节数 ui-sendNumLabel-setText(QString::number(sendSize));//把发送的字节数显示到sendNumLabel上 } } QStringList MainWindow::GetlocalIP() { QStringList strIpAddress; QListQHostAddress ipAddressesList QNetworkInterface::allAddresses(); // 获取第一个本主机的IPv4地址 int nListSize ipAddressesList.size(); for (int i 0; i nListSize; i) { if (ipAddressesList.at(i) ! QHostAddress::LocalHost ipAddressesList.at(i).toIPv4Address()) { strIpAddress ipAddressesList.at(i).toString(); //break; } } // 如果没有找到则以本地IP地址为IP if (strIpAddress.isEmpty()) strIpAddress QHostAddress(QHostAddress::LocalHost).toString(); return strIpAddress; } //选择作为服务器 void MainWindow::on_severRB_clicked() { this-isCheckServer true; this-isServer true; this-isCheckClient false; } //选择作为客户端 void MainWindow::on_clientRB_clicked() { this-isCheckClient true; this-isServer false; this-isCheckServer false; } //启动服务器或者链接服务器 void MainWindow::on_StartBt_clicked() { if(isServer) //服务器 { mServer new QTcpServer(); //关联新客户端链接信号 connect(mServer,SIGNAL(newConnection()),this,SLOT(accept_connect())); mServer-listen(QHostAddress::Any,ui-PortEdit-text().toInt());//启动服务器监听 ui-StartBt-setEnabled(false);//开始按钮禁用 } if(isServer false) //客户端 { mSocket new QTcpSocket(); //检测链接成功信号 connect(mSocket,SIGNAL(connected()),this,SLOT(connect_suc())); // 关联连接失败信号 connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); //设置服务器的 ip和端口号 mSocket-connectToHost(ui-comboBox-currentText(),ui-PortEdit-text().toInt()); //关联接收数据信号 connect(mSocket,SIGNAL(readyRead()),this,SLOT(recv_data())); //关联掉线信号 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_disconnect())); } if(isCheckServer false isCheckClient false)//如果两个都没选择 { QMessageBox::warning(this,提示,请选择服务器或者客户端); ui-StartBt-setEnabled(true); return; } if(isCheckServer)//选择了服务器 { if(ui-PortEdit-text().isEmpty() || ui-PortEdit-text() 请输入端口号) { QMessageBox::warning(this,提示,请输入端口号); ui-StartBt-setEnabled(true); return; } } if(isCheckClient)//选择了客户端 { if(ui-comboBox-currentText().isEmpty()) { QMessageBox::warning(this,提示,请输入ip和端口号); ui-StartBt-setEnabled(true); return; } } } void MainWindow::displayError(QAbstractSocket::SocketError socketError) { switch (socketError) { case QAbstractSocket::RemoteHostClosedError: qDebug() The remote host closed the connection; break; case QAbstractSocket::HostNotFoundError: qDebug() The host was not found; break; case QAbstractSocket::ConnectionRefusedError: qDebug() The connection was refused by the peer; break; default: qDebug() The following error occurred: mSocket-errorString(); } } //关闭服务器或者断开 void MainWindow::on_closeBt_clicked() { if(isServer)//服务器 { for(int i0;iclients.count();i) { clients.at(i)-close();//关闭所有客户端 } //关闭所有服务器之后开始按钮才能启用 mServer-close(); ui-StartBt-setEnabled(true); } else //客户端 { mSocket-close();//关闭客户端 ui-StartBt-setEnabled(true);//启用开始按钮 } } //双击选择要发送的客户端 void MainWindow::on_onlineUserList_doubleClicked(const QModelIndex index) { mSocket clients.at(index.row()); } //自动发送数据 void MainWindow::on_autoCB_clicked(bool checked) { if(checked) { if(ui-autoTimeEdit-text().toInt() 0) { QMessageBox::warning(this,提示,请输入时间值ms); ui-autoCB-setChecked(false);//把按钮重新置于没选中的状态 return; } mTimer-start(ui-autoTimeEdit-text().toInt());//启动定时器 } else { mTimer-stop();//停止定时器 } } //手动发送数据 void MainWindow::on_sendMsgBt_clicked() { auto_time_send(); } //清空接收区 void MainWindow::on_clearRcvBt_clicked() { ui-receiveNumLabel-clear(); this-recvSize 0; ui-receiveNumLabel-setText(QString::number(recvSize)); } //清空发送区 void MainWindow::on_clearSendBt_clicked() { ui-sendNumLabel-clear(); this-sendSize 0; ui-sendNumLabel-setText(QString::number(sendSize)); }UI文件?xml version1.0 encodingUTF-8? ui version4.0 classMainWindow/class widget classQMainWindow nameMainWindow property namegeometry rect x0/x y0/y width800/width height600/height /rect /property property namewindowTitle stringMainWindow/string /property widget classQWidget namecentralwidget layout classQGridLayout namegridLayout item row0 column0 layout classQVBoxLayout nameverticalLayout_2 item widget classQRadioButton nameseverRB property nametext stringTCP服务端/string /property /widget /item item widget classQRadioButton nameclientRB property nametext stringTCP客户端/string /property /widget /item item layout classQHBoxLayout namehorizontalLayout_4 item widget classQLabel namelabel property nametext stringIP/string /property /widget /item item widget classQComboBox namecomboBox/ /item /layout /item item layout classQFormLayout nameformLayout_3 item row0 column0 widget classQLabel namelabel_2 property nametext string端口/string /property /widget /item item row0 column1 widget classQLineEdit namePortEdit property nametext string2103/string /property /widget /item /layout /item item layout classQHBoxLayout namehorizontalLayout_3 item widget classQPushButton nameStartBt property nametext string开启/string /property /widget /item item widget classQPushButton namecloseBt property nametext string关闭/string /property /widget /item /layout /item item layout classQFormLayout nameformLayout item row0 column0 widget classQLabel namelabel_3 property nametext string在线:/string /property /widget /item item row0 column1 widget classQLabel nameonlineUserCount property nametext string0/string /property /widget /item /layout /item item widget classQListWidget nameonlineUserList/ /item /layout /item item row0 column1 layout classQVBoxLayout nameverticalLayout item widget classQListWidget namereceiveList/ /item item layout classQHBoxLayout namehorizontalLayout item widget classQLabel namelabel_5 property nametext string接收:/string /property /widget /item item widget classQLabel namereceiveNumLabel property nametext string0/string /property /widget /item item widget classQPushButton nameclearRcvBt property nametext string清空接收/string /property /widget /item item spacer namehorizontalSpacer property nameorientation enumQt::Horizontal/enum /property property namesizeHint stdset0 size width40/width height20/height /size /property /spacer /item item widget classQLabel namelabel_8 property nametext string发送:/string /property /widget /item item widget classQLabel namesendNumLabel property nametext string0/string /property /widget /item item widget classQPushButton nameclearSendBt property nametext string清空发送/string /property /widget /item /layout /item item widget classQTextEdit namesendMsgEdit/ /item item layout classQHBoxLayout namehorizontalLayout_2 item widget classQLabel namelabel_9 property nametext string时间:/string /property /widget /item item widget classQLineEdit nameautoTimeEdit/ /item item spacer namehorizontalSpacer_2 property nameorientation enumQt::Horizontal/enum /property property namesizeHint stdset0 size width40/width height20/height /size /property /spacer /item item widget classQCheckBox nameautoCB property nametext string自动/string /property /widget /item item widget classQPushButton namesendMsgBt property nametext string发送/string /property /widget /item /layout /item /layout /item /layout /widget widget classQMenuBar namemenubar property namegeometry rect x0/x y0/y width800/width height22/height /rect /property /widget widget classQStatusBar namestatusbar/ /widget resources/ connections/ /uipro文件QT core gui QT network greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c17 # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES \ main.cpp \ mainwindow.cpp HEADERS \ mainwindow.h FORMS \ mainwindow.ui # Default rules for deployment. qnx: target.path /tmp/$${TARGET}/bin else: unix:!android: target.path /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS target二、测试
QT(10)-TCP数据收发
一、源码头文件#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QTcpServer #include QTcpSocket #include QHostAddress #include QFile #include QTimer #include QMessageBox #include QNetworkInterface QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); QStringList GetlocalIP(); private slots: void on_severRB_clicked();//选择作为服务器 void on_clientRB_clicked();//选择作为客户端 void on_StartBt_clicked();//启动服务器或链接客户端 void on_closeBt_clicked();//关闭服务器或断开客户端 void on_onlineUserList_doubleClicked(const QModelIndex index);//选择给哪个客户端发送数据 void on_autoCB_clicked(bool checked);//选择自动发送还是手动发送 void on_sendMsgBt_clicked();//发送信息 //服务器 void accept_connect();//与newconnection信号关联 void recv_data(); //接收数据 void auto_time_send();//定时器定时发送数据 void client_disconnect();//关联掉线信号 void connect_suc();//检测客户端连接成功信号 void on_clearRcvBt_clicked(); void displayError(QAbstractSocket::SocketError socketError); void on_clearSendBt_clicked(); private: Ui::MainWindow *ui; QTimer *mTimer;//定时发送数据 QTcpServer *mServer; QTcpSocket *mSocket; QVectorQTcpSocket* clients; //存储所有在线客户端容器 bool isServer;//标志位,true为服务器false为客户端 //保存接收和发送数据的字节数 quint64 recvSize; quint64 sendSize; qint16 onNum 0; bool isCheckServer;//判断是否选择了服务器 bool isCheckClient;//判断是否选择了客户端 }; #endif // MAINWINDOW_HC文件#include mainwindow.h #include ui_mainwindow.h MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); recvSize 0; sendSize 0; //获取本地ip QStringList localIP GetlocalIP(); ui-comboBox-addItems(localIP); //初始化定时器 mTimer new QTimer(); connect(mTimer,SIGNAL(timeout()),this,SLOT(auto_time_send())); } MainWindow::~MainWindow() { delete ui; } //与newconnection信号关联 void MainWindow::accept_connect() { mSocket mServer-nextPendingConnection(); //返回与客户端连接通信的套接字 //关联接收数据信号 connect(mSocket,SIGNAL(readyRead()),this,SLOT(recv_data())); //关联掉线信号 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_disconnect())); //上线用户添加到客户列表容器 clients.append(mSocket); //把用户添加到界面列表中 QString ip mSocket-peerAddress().toString().remove(::ffff:);//去除客户端中多余的字符 ui-onlineUserList-addItem(ip); //在线数量添加 onNum; ui-onlineUserCount-setText(QString::number(onNum));//显示在线数 } //接收数据 void MainWindow::recv_data() { QTcpSocket *obj (QTcpSocket*)sender(); //获取发送数据端的IP QString ip obj-peerAddress().toString(); ip.remove(::ffff:); QString msg obj-readAll(); ui-receiveList-addItem(ip:msg);//显示接收到的数据 recvSize msg.size();//统计接收到的数据的字节数 ui-receiveNumLabel-setText(QString::number(recvSize)); } void MainWindow::client_disconnect() { QTcpSocket *obj (QTcpSocket*)sender();//获取掉线对象 if(isServer) { int row clients.indexOf(obj);//找到掉线对象的内容所在的行 QListWidgetItem *item ui-onlineUserList-takeItem(row);//从界面列表中去除找到的一行内容 delete item; clients.remove(row);//从容器中删除对象 //掉线时删除在线数量 onNum--; ui-onlineUserCount-setText(QString::number(onNum)); } else { ui-StartBt-setEnabled(true);//断开连接的时候重新启用开始按钮 } } //客户端连接成功 void MainWindow::connect_suc() { ui-StartBt-setEnabled(false);//连接成功则禁用开始按钮 } //定时器定时发送数据 void MainWindow::auto_time_send() { quint64 len mSocket-write(ui-sendMsgEdit-toPlainText().toUtf8()); if(len 0) { sendSize len;//统计发送的字节数 ui-sendNumLabel-setText(QString::number(sendSize));//把发送的字节数显示到sendNumLabel上 } } QStringList MainWindow::GetlocalIP() { QStringList strIpAddress; QListQHostAddress ipAddressesList QNetworkInterface::allAddresses(); // 获取第一个本主机的IPv4地址 int nListSize ipAddressesList.size(); for (int i 0; i nListSize; i) { if (ipAddressesList.at(i) ! QHostAddress::LocalHost ipAddressesList.at(i).toIPv4Address()) { strIpAddress ipAddressesList.at(i).toString(); //break; } } // 如果没有找到则以本地IP地址为IP if (strIpAddress.isEmpty()) strIpAddress QHostAddress(QHostAddress::LocalHost).toString(); return strIpAddress; } //选择作为服务器 void MainWindow::on_severRB_clicked() { this-isCheckServer true; this-isServer true; this-isCheckClient false; } //选择作为客户端 void MainWindow::on_clientRB_clicked() { this-isCheckClient true; this-isServer false; this-isCheckServer false; } //启动服务器或者链接服务器 void MainWindow::on_StartBt_clicked() { if(isServer) //服务器 { mServer new QTcpServer(); //关联新客户端链接信号 connect(mServer,SIGNAL(newConnection()),this,SLOT(accept_connect())); mServer-listen(QHostAddress::Any,ui-PortEdit-text().toInt());//启动服务器监听 ui-StartBt-setEnabled(false);//开始按钮禁用 } if(isServer false) //客户端 { mSocket new QTcpSocket(); //检测链接成功信号 connect(mSocket,SIGNAL(connected()),this,SLOT(connect_suc())); // 关联连接失败信号 connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); //设置服务器的 ip和端口号 mSocket-connectToHost(ui-comboBox-currentText(),ui-PortEdit-text().toInt()); //关联接收数据信号 connect(mSocket,SIGNAL(readyRead()),this,SLOT(recv_data())); //关联掉线信号 connect(mSocket,SIGNAL(disconnected()),this,SLOT(client_disconnect())); } if(isCheckServer false isCheckClient false)//如果两个都没选择 { QMessageBox::warning(this,提示,请选择服务器或者客户端); ui-StartBt-setEnabled(true); return; } if(isCheckServer)//选择了服务器 { if(ui-PortEdit-text().isEmpty() || ui-PortEdit-text() 请输入端口号) { QMessageBox::warning(this,提示,请输入端口号); ui-StartBt-setEnabled(true); return; } } if(isCheckClient)//选择了客户端 { if(ui-comboBox-currentText().isEmpty()) { QMessageBox::warning(this,提示,请输入ip和端口号); ui-StartBt-setEnabled(true); return; } } } void MainWindow::displayError(QAbstractSocket::SocketError socketError) { switch (socketError) { case QAbstractSocket::RemoteHostClosedError: qDebug() The remote host closed the connection; break; case QAbstractSocket::HostNotFoundError: qDebug() The host was not found; break; case QAbstractSocket::ConnectionRefusedError: qDebug() The connection was refused by the peer; break; default: qDebug() The following error occurred: mSocket-errorString(); } } //关闭服务器或者断开 void MainWindow::on_closeBt_clicked() { if(isServer)//服务器 { for(int i0;iclients.count();i) { clients.at(i)-close();//关闭所有客户端 } //关闭所有服务器之后开始按钮才能启用 mServer-close(); ui-StartBt-setEnabled(true); } else //客户端 { mSocket-close();//关闭客户端 ui-StartBt-setEnabled(true);//启用开始按钮 } } //双击选择要发送的客户端 void MainWindow::on_onlineUserList_doubleClicked(const QModelIndex index) { mSocket clients.at(index.row()); } //自动发送数据 void MainWindow::on_autoCB_clicked(bool checked) { if(checked) { if(ui-autoTimeEdit-text().toInt() 0) { QMessageBox::warning(this,提示,请输入时间值ms); ui-autoCB-setChecked(false);//把按钮重新置于没选中的状态 return; } mTimer-start(ui-autoTimeEdit-text().toInt());//启动定时器 } else { mTimer-stop();//停止定时器 } } //手动发送数据 void MainWindow::on_sendMsgBt_clicked() { auto_time_send(); } //清空接收区 void MainWindow::on_clearRcvBt_clicked() { ui-receiveNumLabel-clear(); this-recvSize 0; ui-receiveNumLabel-setText(QString::number(recvSize)); } //清空发送区 void MainWindow::on_clearSendBt_clicked() { ui-sendNumLabel-clear(); this-sendSize 0; ui-sendNumLabel-setText(QString::number(sendSize)); }UI文件?xml version1.0 encodingUTF-8? ui version4.0 classMainWindow/class widget classQMainWindow nameMainWindow property namegeometry rect x0/x y0/y width800/width height600/height /rect /property property namewindowTitle stringMainWindow/string /property widget classQWidget namecentralwidget layout classQGridLayout namegridLayout item row0 column0 layout classQVBoxLayout nameverticalLayout_2 item widget classQRadioButton nameseverRB property nametext stringTCP服务端/string /property /widget /item item widget classQRadioButton nameclientRB property nametext stringTCP客户端/string /property /widget /item item layout classQHBoxLayout namehorizontalLayout_4 item widget classQLabel namelabel property nametext stringIP/string /property /widget /item item widget classQComboBox namecomboBox/ /item /layout /item item layout classQFormLayout nameformLayout_3 item row0 column0 widget classQLabel namelabel_2 property nametext string端口/string /property /widget /item item row0 column1 widget classQLineEdit namePortEdit property nametext string2103/string /property /widget /item /layout /item item layout classQHBoxLayout namehorizontalLayout_3 item widget classQPushButton nameStartBt property nametext string开启/string /property /widget /item item widget classQPushButton namecloseBt property nametext string关闭/string /property /widget /item /layout /item item layout classQFormLayout nameformLayout item row0 column0 widget classQLabel namelabel_3 property nametext string在线:/string /property /widget /item item row0 column1 widget classQLabel nameonlineUserCount property nametext string0/string /property /widget /item /layout /item item widget classQListWidget nameonlineUserList/ /item /layout /item item row0 column1 layout classQVBoxLayout nameverticalLayout item widget classQListWidget namereceiveList/ /item item layout classQHBoxLayout namehorizontalLayout item widget classQLabel namelabel_5 property nametext string接收:/string /property /widget /item item widget classQLabel namereceiveNumLabel property nametext string0/string /property /widget /item item widget classQPushButton nameclearRcvBt property nametext string清空接收/string /property /widget /item item spacer namehorizontalSpacer property nameorientation enumQt::Horizontal/enum /property property namesizeHint stdset0 size width40/width height20/height /size /property /spacer /item item widget classQLabel namelabel_8 property nametext string发送:/string /property /widget /item item widget classQLabel namesendNumLabel property nametext string0/string /property /widget /item item widget classQPushButton nameclearSendBt property nametext string清空发送/string /property /widget /item /layout /item item widget classQTextEdit namesendMsgEdit/ /item item layout classQHBoxLayout namehorizontalLayout_2 item widget classQLabel namelabel_9 property nametext string时间:/string /property /widget /item item widget classQLineEdit nameautoTimeEdit/ /item item spacer namehorizontalSpacer_2 property nameorientation enumQt::Horizontal/enum /property property namesizeHint stdset0 size width40/width height20/height /size /property /spacer /item item widget classQCheckBox nameautoCB property nametext string自动/string /property /widget /item item widget classQPushButton namesendMsgBt property nametext string发送/string /property /widget /item /layout /item /layout /item /layout /widget widget classQMenuBar namemenubar property namegeometry rect x0/x y0/y width800/width height22/height /rect /property /widget widget classQStatusBar namestatusbar/ /widget resources/ connections/ /uipro文件QT core gui QT network greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c17 # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES \ main.cpp \ mainwindow.cpp HEADERS \ mainwindow.h FORMS \ mainwindow.ui # Default rules for deployment. qnx: target.path /tmp/$${TARGET}/bin else: unix:!android: target.path /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS target二、测试