Qt实现软件开机启动(可选择功能)

实现目标

类似于常见电脑软件的自动开机选项。

  • 组成:
  1. 设置开机启动和取消开机启动的选择框以及功能实现
  2. 存储是否开机启动的信息(为了开机启动后读取信息继续让它开机启动)
  • 效果:
    在这里插入图片描述

细节

一开始写的时候把配置文件存到了软件所在的目录,然后重启电脑测试,发现并没有读取配置文件。找了好久的错误,我把目光放到了注册表那里,于是加了这样一串代码:·
QMessageBox::information(nullptr,"info",configFilePath);
重新开机启动后弹出来的是这样的:(用大白菜装机的时候莫名把系统盘符弄成了X。。。)
在这里插入图片描述
但是我的软件目录在这:X:\Users\Eloik\Desktop\auto
在这里插入图片描述
行。。。既然是注册表开机启动读取的是这个目录,那我就弄成这个目录。。。
然后就将configFilePath = QDir::QDir::currentPath() + "/config.cfg";
改成了:systemDrive = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation).at(0).at(0);
configFilePath = systemDrive + ":/Windows/System32/configInfo.cfg";
第一行是考虑到有的人(比如我)的系统盘符不是C,先获取系统盘符
然后再进行测试,完美成功!

实现

  • widget.h 代码如下:
#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include <QLabel>
#include <QCheckBox>


class Widget : public QWidget
{
    Q_OBJECT


public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


    void init();//初始化窗口
    void AutomaticStartup(bool isStart);//是否开机启动
    void RWConfigFiles(QString pattern);//读写配置文件(存储开机启动状态)


private:
    QLabel * running_label;//开机启动标签
    QCheckBox * runningWithSystemOn;//开机启动选择


    QString systemDrive; //系统盘符
    QString configFilePath;//配置文件目录
    bool m_bRunningState;//开机启动状态
};
#endif // WIDGET_H
  • widget.cpp 代码如下:
#include "widget.h"
#include <QSettings>
#include <QApplication>
#include <QFile>
#include <QMessageBox>
#include <QStandardPaths>
#include <QPen>

//开机启动的注册表
#define AUTO_RUN "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    ,m_bRunningState(false)//默认开机不自动启动
{
    //configFilePath = QDir::QDir::currentPath() + "/config.cfg";
    //获取系统盘符
    systemDrive = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation).at(0).at(0);
    //配置文件存储位置
    configFilePath = systemDrive + ":/Windows/System32/configInfo.cfg";

    RWConfigFiles("READ");//每次运行程序读取配置文件
    //QMessageBox::information(nullptr,"info",configFilePath);
    this->resize(300,150);
    init();
}

Widget::~Widget()
{
}

void Widget::init()
{
    QFont font("Times", 12);//设置字体大小为12

    running_label = new QLabel(this);
    running_label->setText("是否开机启动:");
    running_label->setFont(font);
    running_label->setGeometry(8,20,140,48);
    running_label->setStyleSheet("color:rgb(0,0,0);");//设置字体颜色为黑色

    runningWithSystemOn = new QCheckBox(this);
    runningWithSystemOn->setText("开机启动");
    runningWithSystemOn->setFont(font);
    runningWithSystemOn->setStyleSheet("color:rgb(0,0,0);");//设置字体颜色为黑色

    if(m_bRunningState)//每次启动程序根据读取存储文件的内容设置选择状态
    {
        runningWithSystemOn->setCheckState(Qt::Checked);
        AutomaticStartup(true);
    }
    else
    {
        runningWithSystemOn->setCheckState(Qt::Unchecked);
        AutomaticStartup(false);
    }

    runningWithSystemOn->setGeometry(160,20,120,48);
    connect(runningWithSystemOn,&QCheckBox::clicked,this,[=]()
    {
        if(runningWithSystemOn->isChecked())
        {
            m_bRunningState = true;
            RWConfigFiles("WRITE");
            AutomaticStartup(true);
            //开机启动
        }
        else
        {
            m_bRunningState = false;
            RWConfigFiles("WRITE");
            AutomaticStartup(false);
            //取消开机启动
        }
    });
}


//操作注册表实现开机启动
void Widget::AutomaticStartup(bool isStart)
{
     QString  strApplicationName = QApplication::applicationName();//获取应用名称
     QSettings * settings = new QSettings(AUTO_RUN, QSettings::NativeFormat);

     if(isStart)
     {
         QString strApplicationFilePath = QApplication::applicationFilePath();//获取应用的目录
         settings->setValue(strApplicationName, strApplicationFilePath.replace("/", "\\"));//写入注册表
     }
     else
         settings->remove(strApplicationName);//移除注册表
}

//读写配置文件
// 1表示开机启动,0表示不开机启动
void Widget::RWConfigFiles(QString pattern)
{
    QFile file(configFilePath);

    if(pattern == "READ")
    {
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::warning(nullptr,"warning","读取配置文件失败");
            return;
        }
        QString strRunningState = file.readAll();

        if(strRunningState.at(0) == "1")
            m_bRunningState = true;
        else if(strRunningState.at(0) == "0")
            m_bRunningState = false;
    }
    else if(pattern == "WRITE")
    {
        if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
        {
            QMessageBox::warning(nullptr,"warning","写入配置文件失败");
            return;
        }
        if(m_bRunningState)
            file.write("1");
        else
            file.write("0");
    }
}

  • main.cpp 代码如下:
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值