QT Windows 小功能实现

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;
  }
}
  • 需要注意的是QSystemTrayIconb必须要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()打印调试信息实际应用中可以去掉

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值