Qt 自定义菜单 托盘菜单

托盘菜单实现:通过QSystemTrayIcon+QMenu+QAction即可完美实现!

实现方式:createActions用于创建菜单、菜单项,translateActions用于设置文本、实现多语化,translateAccount用于设置用户空间配额。

cpp 复制代码
void TrayMenu::createActions()
{
    help_menu = new QMenu();

    //创建菜单项
    action_show = new QAction(this);
    action_quit = new QAction(this);
    action_login_home = new QAction(this);
    action_account = new QAction(this);
    action_user_space = new QAction(this);
    action_help = new QAction(this);
    action_about = new QAction(this);
    action_check_update = new QAction(this);
    action_setting = new QAction(this);

   help_menu->setIcon(QIcon(":/icon/help"));
   action_show->setIcon(QIcon(":/icon/open"));
   action_login_home->setIcon(QIcon(":/icon/home"));
   action_account->setIcon(QIcon(":/icon/user"));
   action_help->setIcon(QIcon(":/icon/help"));
   action_about->setIcon(QIcon(":/icon/about"));
   action_check_update->setIcon(QIcon(":/icon/update"));
   action_setting->setIcon(QIcon(":/icon/set"));
   action_quit->setIcon(QIcon(":/icon/quit"));

    //添加菜单项
   help_menu->addAction(action_about);
   help_menu->addAction(action_help);
   help_menu->addAction(action_check_update);
   this->addAction(action_show);
   this->addAction(action_login_home);
   this->addSeparator();
   this->addAction(action_account);
   this->addAction(action_user_space);
   this->addSeparator();
   this->addAction(action_setting);
   this->addMenu(help_menu);
   this->addAction(action_quit);

    //设置信号连接
    connect(action_show, SIGNAL(triggered(bool)), this, SIGNAL(showWidget()));
    connect(action_quit, SIGNAL(triggered(bool)), this, SIGNAL(logoutWidget()));
    connect(action_setting, SIGNAL(triggered(bool)), this, SIGNAL(setUp()));
    connect(action_about, SIGNAL(triggered(bool)), this, SIGNAL(aboutUs()));
    connect(action_login_home, SIGNAL(triggered(bool)), MenuAction::getInstance(), SLOT(openLoginHome()));
    connect(action_help, SIGNAL(triggered(bool)), MenuAction::getInstance(), SLOT(openHelpMe()));
    QObject::connect(action_check_update, SIGNAL(triggered(bool)), MenuAction::getInstance(), SLOT(openCheckUpdate()));
}

void TrayMenu::translateActions()
{
   help_menu->setTitle(tr("help"));
   action_show->setText(tr("open"));
   action_quit->setText(tr("quit"));
   action_login_home->setText(tr("login home"));
   this->translateAccount();
   action_help->setText(tr("instruction"));
   action_about->setText(tr("about us"));
   action_check_update->setText(tr("check update"));
   action_setting->setText(tr("setting"));
}

void TrayMenu::translateAccount()
{
   action_user_space->setText(tr("use:") + use_space + QString("  ") + tr("total:") + total_space);
}

   托盘菜单项建立完成之后,在建立自己的托盘,包括:托盘图标、托盘提示信息等。
QSystemTrayIcon *system_tray = new QSystemTrayIcon();

//放在托盘提示信息、托盘图标
system_tray ->setToolTip(QString("我就是托盘"));
system_tray ->setIcon(QIcon(":/icon/login"));

TrayMenu *tray_menu = new TrayMenu();
system_tray->setContextMenu(tray_menu);

//点击托盘执行的事件
connect(system_tray , SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconIsActived(QSystemTrayIcon::ActivationReason)));
    connect(tray_menu, SIGNAL(showWidget()), this, SLOT(showNormal()));

//显示托盘
system_tray->show();

//托盘显示提示信息
system_tray->showMessage(QString("托盘标题"), QString("托盘显示内容"));
相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
陌上丨5 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
AI_56785 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw5 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30735 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道6 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7256 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai