实现目标
类似于常见电脑软件的自动开机选项。
- 组成:
- 设置开机启动和取消开机启动的选择框以及功能实现
- 存储是否开机启动的信息(为了开机启动后读取信息继续让它开机启动)
- 效果:
细节
一开始写的时候把配置文件存到了软件所在的目录,然后重启电脑测试,发现并没有读取配置文件。找了好久的错误,我把目光放到了注册表那里,于是加了这样一串代码:·
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();
}