Qt6-网络关机助手(开机自启版)实现

简介: 在前面已经预告了,要写一个网络关机助手了。这里先看下我的成果吧。

源码连接:https://download.csdn.net/download/z609932088/15422254

程序截图如下


image.png

目前这个小工具已经开发完成,欢迎小伙伴们一起交流。

 

设置程序图标

Qt6这里设置程序运行的图标又回到了以前的版本了。首先在工程文件夹下面建立一个rc文件,输入以下内容

image.png

准备一个ico格式的图片和这个文件放在一起。


image.png

在CMakeList文件中加入以下代码

set(PROJECT_SOURCES
        icon.rc
)

这样编译以后的程序就有图标了。



设置程序开机自启动

设置程序开机自启动需要用到写注册表,这里需要使用到管理员权限,在运行Qt Creator 的时候也要使用管理员运行。


便携开机启动的注册表代码,这里声明一下,这部分代码是抄的网上的,但是连接找不到了,对贡献者说声抱歉。

/**
 * @brief autoStart
 * 开机自启动
 */
void autoStart()
{
    QString appName = QApplication::applicationName();
    QString appPath = QApplication::applicationFilePath();
    appPath = appPath.replace("/","\\");
    QSettings *reg=new QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);
    QString val = reg->value(appName).toString();
    if(val != appPath)
        reg->setValue(appName,appPath);
    reg->deleteLater();
}

剩下就是在main函数中调用即可,如下

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    autoStart();
    MainWindow w;
    return a.exec();
}

实现程序在隐藏标题栏情况下可移动

还是重写鼠标事件,就有部分接口不一样了。不过旧的依旧可以使用

/**
     * @brief mousePressEvent
     * @param event
     * 鼠标按下
     */
    void mousePressEvent(QMouseEvent* event);
    /**
     * @brief mouseMoveEvent
     * @param event
     * 鼠标移动
     */
    void mouseMoveEvent(QMouseEvent* event);
    /**
     * @brief mouseReleaseEvent
     * @param event
     * 鼠标释放
     */
    void mouseReleaseEvent(QMouseEvent* event);

实现如下

static QPoint last(0,0);        //保存坐标
const int TITLE_HEIGHT = 50;    //这里也可以使用宏定义,保存标题高度,也就是鼠标点击区域的高度
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->position().y()<TITLE_HEIGHT)
    {
        last = event->globalPosition().toPoint();
    }
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->position().y()<TITLE_HEIGHT)
    {
        int dx = event->globalPosition().x() - last.x();
        int dy = event->globalPosition().y() - last.y();
        last = event->globalPosition().toPoint();
        this->move(this->x()+dx,this->y()+dy);
    }
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->position().y()<TITLE_HEIGHT)
    {
        int dx = event->globalPosition().x() - last.x();
        int dy = event->globalPosition().y() - last.y();
        this->move(this->x()+dx,this->y()+dy);
    }
}

现调用外部bat脚本文件

这里有一个坑需要注意的就是“QCoreApplication::applicationDirPath();”与之对应的还有一个currentPath()函数,这个在一般使用没有啥问题,与开机自启动功能结合使用的时候就会出现找不到文件的情况。这个大问题也是网上找到的,但是还是一样,参考连接找不到了。


 

void MainWindow::powerOffBat()
{
    QString strinfo;
    QProcess p(NULL);
    QString curPath = QCoreApplication::applicationDirPath();
    QString toolPath;
    toolPath = "/BAT";
    curPath.append(toolPath);
    p.setWorkingDirectory(curPath);
    toolPath = "/poweroff.bat";
    curPath.append(toolPath);
    p.start(curPath);
    if(p.waitForFinished())
    {
        qDebug() << "成功";
    }
    else
    {
        QMessageBox::warning(this,"警告","执行关机脚本失败\r\n请检查程序根目录下BAT文件中是否存在‘poweroff.bat’");
    }
}

实现系统托盘显示功能

void MainWindow::initMySystemTrayIcon()
{
    /*
     * 设置系统托盘内容
     */
    m_trayIcon = new QSystemTrayIcon(this);
    m_trayIcon->setIcon(QIcon(":/images/images/logo.ico"));
    m_trayIcon->setToolTip("关机助手");
    m_trayIcon->show();
    connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){
        switch (temp) {
        case QSystemTrayIcon::Trigger:
        {
            //单击图标时间
            break;
        }
        case QSystemTrayIcon::DoubleClick:
        {
            if(this->isHidden())
            {
                this->showNormal();
            }
            else
            {
                this->hide();
            }
            break;
        }
        }
    });
    initMySystemTrayIconAction();
    initMySystemTrayIconMenu();
//    m_trayIcon->showMessage("Tip","PowerControl is running",QSystemTrayIcon::MessageIcon::Information,3);
}
void MainWindow::initMySystemTrayIconAction()
{
    m_showWindowAction = new QAction(QIcon(":/images/images/logo.ico"),"显示界面",this);
    connect(m_showWindowAction,&QAction::triggered,this,[=](){this->show();});
    m_exitAppAction = new QAction(QIcon(":/images/images/exit.ico"),"退出程序",this);
    connect(m_exitAppAction,&QAction::triggered,this,[=](){this->close();});
    m_powerOffAppAction = new QAction(QIcon(":/images/images/logo.ico"),"一键关机",this);
    connect(m_powerOffAppAction,&QAction::triggered,this,&MainWindow::on_pushButton_poweroff_clicked);
}
void MainWindow::initMySystemTrayIconMenu()
{
    m_trayIconMenu = new QMenu(this);
    m_trayIconMenu->addAction(m_powerOffAppAction);
    m_trayIconMenu->addSeparator();
    m_trayIconMenu->addAction(m_showWindowAction);
    m_trayIconMenu->addAction(m_exitAppAction);
    m_trayIcon->setContextMenu(m_trayIconMenu);
}

实现获取计算机IP地址和名称功能

void MainWindow::getSystemInfor()
{
    m_systemName = QHostInfo::localHostName();
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
    for (int i = 0; i < ipAddressesList.size(); ++i) {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
                ipAddressesList.at(i).toIPv4Address()) {
            m_systemIp = ipAddressesList.at(i).toString();
            break;
        }
    }
    if (m_systemIp.isEmpty())
        m_systemIp = QHostAddress(QHostAddress::LocalHost).toString();
    ui->label_sysInfor->setText(QString("设备名称:%1\r\nI P 地址:%2").arg(m_systemName).arg(m_systemIp));
}


目录
相关文章
|
存储 Cloud Native Linux
C++Qt开机自启动
C++Qt开机自启动
|
存储 Cloud Native Linux
C++ QT 实时进行网络监测
C++ QT 实时进行网络监测
|
4月前
|
网络协议
Qt中的网络编程(Tcp和Udp)运用详解以及简单示范案例
Tcp和Udp是我们学习网络编程中经常接触到的两个通讯协议,在Qt也被Qt封装成了自己的库供我们调用,对于需要进行网络交互的项目中无疑是很重要的,希望这篇文章可以帮助到大家。 是关于Qt中TCP和UDP的基本使用和特点:
634 7
|
2月前
|
安全 Windows
怎样利用 Windows XP实现网络统一关机
怎样利用 Windows XP实现网络统一关机
怎样利用 Windows XP实现网络统一关机
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
147 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
3月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
3月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03
|
6月前
|
网络协议 算法 网络性能优化
Qt TCP网络上位机的设计(通过网络编程与下位机结合)
Qt TCP网络上位机的设计(通过网络编程与下位机结合)
Qt TCP网络上位机的设计(通过网络编程与下位机结合)
|
4月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城

推荐镜像

更多