QT Windows 小功能实现
最小化到系统托盘
使用到的类
#include <QSystemTrayIcon>
简单使用
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("最小化到托盘和开机自启功能测试");
sysTrayInit();
}
void MainWindow::sysTrayInit()
{
QAction *show_action = new QAction("显示主窗口");
QAction *min_action = new QAction("最小化");
QAction *quit_action = new QAction("退出");
QMenu *tray_menu = new QMenu;
tray_menu->addAction(show_action);
tray_menu->addAction(min_action);
tray_menu->addAction(quit_action);
connect(show_action,&QAction::triggered,this,[=](){ this->showNormal(); });
connect(min_action,&QAction::triggered,this,[=](){ this->showMinimized(); });
connect(quit_action,&QAction::triggered,this,[=](){ close(); /*QApplication::quit();*/ }); //close() 关闭时会触发关闭事件 可以根据需求修改
m_systray = new QSystemTrayIcon(this);
m_systray->setIcon(QIcon(":/resource/svgs/svg4.svg")); //必须要给一个Icon
m_systray->setToolTip("我是最小化托盘按钮");
m_systray->setContextMenu(tray_menu); //设置右键菜单
connect(m_systray,&QSystemTrayIcon::activated,this,&MainWindow::SysTrayActivated);
m_systray->show();
}
void MainWindow::SysTrayActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger :
case QSystemTrayIcon::DoubleClick :
qDebug()<<"双击";
m_systray->showMessage("title","被双击");
this->showNormal();
break;
case QSystemTrayIcon::MiddleClick :
m_systray->showMessage("title","被中击");
qDebug()<<"中击";
break;
default:
qDebug()<<"No work";
break;
}
}
- 需要注意的是
QSystemTrayIcon
b必须要setIcon()
一个显示在系统托盘的图标 不然会在控制台输出QSystemTrayIcon::setVisible: No Icon set
同时在系统托盘中也了看不见 setContextMenu
设置右键菜单showMessage
可以以通知的方式显示消息提示- 这里需要说明的一点是 程序里面使用退出
Close()
会触发窗口关闭事件(可以做一些关闭前的设置保存的操作) 如果不想触发关闭事件的可以使用QApplication::quit()
或者QApplication::exit();
开机自启动
操作注册表
- 这种方式是通过将程序的名字和路径组成的键值对写到注册表 电脑开机后通过注册表的路径去启动程序
- 一般都写在注册表的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
这个目录下 - 如果需要自己手动查看需要通过
Win+R
regedit
然后到上面说的目录下查看
使用到的类
#include <QSettings>
#include <QFileInfo>
#include <QDir>
- 主要是使用
QSettings
类对注册表进行操作 如果不清楚基本用法可以看这里
简单使用
QString m_regedit_path = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
void MainWindow::enableAutoStart()
{
QSettings setting(m_regedit_path,QSettings::Registry64Format); //32位使用 Registry32Format
QFileInfo f_info(qApp->applicationFilePath()); //获取程序所在路径
QString name = f_info.baseName();
QString last_path = setting.value(name).toString();
qDebug()<<"f_info:"<<f_info<<name;
qDebug()<<"last_path:"<<last_path;
QString new_path = QDir::toNativeSeparators(qApp->applicationFilePath()); //toNativeSeparators()将‘/’替换为 ‘\’
qDebug()<<"new_path:"<<new_path;
if(last_path != new_path)
{
setting.setValue(name,new_path);
setting.sync();
qDebug()<<setting.status();
}
}
void MainWindow::disenableAutoStart()
{
QFileInfo f_info(qApp->applicationFilePath());
QString name = f_info.baseName();
QSettings setting(m_regedit_path,QSettings::Registry64Format);
qDebug()<<f_info;
qDebug()<<setting.allKeys();
if(setting.contains(name))
{
setting.remove(name);
setting.sync();
qDebug()<<setting.status();
}
}
void MainWindow::on_cBox_AutoStart_clicked(bool checked)
{
if(checked)
{
enableAutoStart();
}
else
{
disenableAutoStart();
}
}
- 为啥使用的时候
m_regedit_path
用的是\\
因为前一个是转义字符 - 这里获取了程序当前路径与注册表中是否一致 不一致则写入当前路径
- 如果程序出现
QSettings: failed to set subkey "xxx": 拒绝访问
请右键管理员运行程序 qDebug()
打印调试信息实际应用中可以去掉