效果图:
代码:
#include "dia_settings.h"
#include <QStandardPaths>
#include <QProcess>
dia_settings::dia_settings(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
//查看注册表是否已经写入程序名称
QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
QString strValue = reg->value("AppLoader").toString();
QString path = QDir::toNativeSeparators(QCoreApplication::applicationFilePath());
bool flag = (strValue == path);
ui.checkBox->setChecked(flag);
}
dia_settings::~dia_settings()
{
}
void dia_settings::ok()
{
}
//Qt实现开机自启
void dia_settings::appAutoRun(bool bAutoRun)
{
m_bAutoRun = bAutoRun;
QSettings settings("./AppConfig.ini", QSettings::IniFormat);
settings.setValue("/AutoRun/autoRun", QString::number(m_bAutoRun));
//建立一个对象写或删注册表的QSettings
QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
QString strValue = reg->value("AppLoader").toString();//查看注册表是否已经写入程序名称
QString strAppPath = QDir::toNativeSeparators(QCoreApplication::applicationFilePath());
bool flag = (strValue == strAppPath);
if (bAutoRun&&!flag)
{
//写入注册表信息(名字和路径)
reg->setValue("AppLoader", strAppPath);
}
else if (!m_bAutoRun&&flag)
{
//删除注册表信息
reg->remove(tr("AppLoader"));
}
delete reg;
}
但是注册表里面的启动项,工作目录继承了父进程的工作目录,也就是system32目录,结果直接通过".\\xxx.exe"的方式对可执行文件同一目录下程序的调用就会因找不到文件而失败。
检查了一下代码,bool QDir::cd ( const QString & dirName ) ,把原来的cd操作想办法替换,然后就OK了。