需求背景:
项目中存在多个电脑,而每个电脑在正式投入使用后,都不可以外接键盘,所以需要一个关机工具。
这个工具也非常简单,主要原理就是UDP广播的原理。主要就是接收到对应的关机指令以后,执行关机操作。同时自己也可以发送关机指令,并关闭自己所在的电脑。
程序目前还是非常简单的,就一个关机按钮。
下面就是实现方法,新建项目啥的看上一篇
这里直接从代码开始
包含网络模块在CMakeLists.txt文件中加入网络模块
find_package(Qt6 COMPONENTS Network REQUIRED)
target_link_libraries(PowerControl PRIVATE Qt6::Network)
包含相关头文件
在头文件中包含对应的头文件
#include <QUdpSocket>
#include <QHostAddress>
#include <QProcess>
#include <QDir>
#include <QtDebug>
初始化UDP Socket绑定端口
m_Scoket = new QUdpSocket();
m_Scoket->bind(8088,QUdpSocket::ShareAddress);
connect(m_Scoket,&QUdpSocket::readyRead,this,&MainWindow::getUDPDate);
调用关机指令
其实实现关机的方式有很多,可以在Qt中直接加入关机指令,也可以直接调用关机程序,同样也可以使用脚本来实现关机功能,我这里将实现调用外部脚本来实现功能。
QString strinfo;
QProcess p(NULL);
QString curPath = QDir::currentPath();
QString toolPath;
toolPath = "/BAT";
curPath.append(toolPath);
p.setWorkingDirectory(curPath);
toolPath = "/poweroff.bat";
curPath.append(toolPath);
p.start(curPath);
if(p.waitForFinished())
{
}
else
{
}
核心功能就基本完成了,在Bat文件里面直接写CMD指令就可以了。
解析就更简单了,看下
while (m_Scoket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(m_Scoket->pendingDatagramSize());
m_Scoket->readDatagram(datagram.data(),datagram.size());
if(datagram.toInt() == 0x01)
{
powerOffBat();
}
}
这里呢,有个问题出现了,就是我把程序Release了以后你,运行的时候会有CMD窗口,好烦人,百度了一对QT相关的设置,都没有搞定,最后还是找CMake关键字找到了
防止找不到系列:
只需要在cmakelists.txt中添加set(CMAKE_CXX_FLAGS "-mwindows")
或者在cmake时指定编译参数cmake -DCMAKE_CXX_FLAGS="-mwindows"即可
如果用的是c而不是c++,就只需把CXX改为C