3

Qt添加图标、资源文件相关、最小化到托盘

 2 years ago
source link: https://discretetom.github.io/posts/qt-tray-icon/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Qt添加图标、资源文件相关、最小化到托盘

Qt添加图标、资源文件相关、最小化到托盘

程序添加图标

以最近写的ToDoStack为例

首先确保图标文件在源码目录中

打开项目文件ToDoStack.pro,在最后一行添加

//ToDoStack.ico是此程序的图标文件
RC_ICONS = ToDoStack.ico

这样程序就会以ToDoStack.ico作为图标

最小化托盘需要的图标

最小化托盘时显示的图标在资源文件

项目-新建文件-Qt-Qt Resource File

2-1

命名(本项目中命名为myicon)

2-2

这样在左侧项目视图中会出现资源文件夹

2-3

编辑资源文件,点击添加-添加前缀(前缀类似于文件夹的作用),默认会出现一个名为 /new/prefix1 的前缀

在本项目中,我将它改名为**/img**

2-4

然后点击添加-添加文件,选中我们的托盘图标文件添加进来即可

注意:托盘图标文件不建议使用ico而建议使用png,否则可能无法正常显示

实现最小化到托盘

需要的头文件

#include <QAction>//用来生成鼠标点击托盘图标后出现的菜单
#include <QMenu>//用来生成鼠标点击托盘图标后出现的菜单
#include <QSystemTrayIcon>//托盘图标类

给MainWindow.h添加私有子控件指针

QSystemTrayIcon * icon;//托盘图标
QAction * actionShow;//显示窗口操作
QAction * actionClose;//退出程序操作
QMenu * menu;//菜单

在构造函数中初始化

注意从资源文件获取图标的时候路径不是:/myicon/img/ToDoStack.png而是:/img/ToDoStack.png

icon = new QSystemTrayIcon(this);//获取托盘图标对象
QIcon thisIcon(":/img/ToDoStack.png");//从资源文件获取托盘图标的图标文件
icon->setIcon(thisIcon);//设置托盘图标的图标文件
connect(icon, &QSystemTrayIcon::activated, this, &MainWindow::trayClicked);//点击托盘图标发生的事件
icon->show();//在托盘显示此图标
actionShow = new QAction(tr("Show(&S)"), this);//显示窗口操作
actionClose = new QAction(tr("Exit(&E)"), this);//退出程序操作
menu = new QMenu(this);
menu->addAction(actionShow);//添加至菜单
menu->addAction(actionClose);
connect(actionShow, &QAction::triggered, this, &MainWindow::getShow);
connect(actionClose, &QAction::triggered, this, &MainWindow::getExit);

在头文件添加对应的槽

void trayClicked(QSystemTrayIcon::ActivationReason reason);//此处参数类型不能改动,因为要匹配对应的信号
void getShow();
void getExit();

在源文件中完成函数

void MainWindow::trayClicked(QSystemTrayIcon::ActivationReason reason)
{
	switch (reason){//reason为托盘图标被触发的形式
	case QSystemTrayIcon::Context://鼠标右键点击
		menu->exec(this->cursor().pos());//显示菜单 注意不是show()
		break;
	case QSystemTrayIcon::Trigger://鼠标左键点击
		show();//显示主窗口
		break;
	}
}

void MainWindow::getShow()
{
	show();//显示主窗口
}

void MainWindow::getExit()
{
	qApp->quit();//退出程序
}

最后,拦截主窗口自身的关闭操作,实现点击关闭按钮时默认隐藏到托盘的效果

#include <QCloseEvent>//用来拦截窗口关闭事件

在头文件中添加protected方法

void closeEvent(QCloseEvent * e);

会发现这里的方法名closeEvent变成了斜体,表示我们不能改动这个方法名

最后在源文件完善函数

void MainWindow::closeEvent(QCloseEvent *e)
{
	e->ignore();//忽略原本的关闭操作
	hide();//仅仅隐藏主窗口
}

添加托盘注释

QSystemTrayIcon类的方法setToolTip可以设置托盘图标注释


Recommend

  • 78
    • studygolang.com 5 years ago
    • Cache

    Golang Walk 托盘菜单

    最近在用Golang开发一个客户端。客户端打开之后,会打开系统浏览器然后弹出一个网页。 目前已经写的差不多了,但是有个问题疑惑着我,Golang有没有类似C# contextMenu的东西呢,我在 github.com 上看到了

  • 43
    • blog.itlee.top 4 years ago
    • Cache

    Electron托盘&开机自启动

    在做前端项目时,需要将 Web 项目打包成 Win 应用,使用 Electron 相关技术。这个系列是整理 Electron 学习中遇到的问题和常见知识点,留做记录方便后续复习。 本篇介绍: Electron 系统托盘实现 Electron...

  • 13

    产品信息是向用户展示自家产品的直接方式。虽然是否有产品信息对程序功能没有任何影响,但是程序如果缺少了产品信息给人的感觉是不够正规!作为一名负责任的开发人员,你一定想为自己写的程序添加产品信息。你知道该如何添加吗?如何自动更新版本信息吗?...

  • 10

    首发|4年融4轮 托盘循环共用服务商“普拉托”再获5000万融资 ...

  • 9
    • www.cnblogs.com 3 years ago
    • Cache

    使用Mono.Cecil动态添加资源文件

    使用Mono.Cecil动态添加资源文件 代码示例如下,内容待补充。 using (var assemblyDef = AssemblyDefinition.Rea...

  • 5

    优麒麟 - 任务栏新版托盘协议(SNI)介绍 发布时间:2021-07-29 18:00:20...

  • 5

    恢复 GNOME 顶栏的托盘图标 | Linux 中国这确实是个大问题,好在,我们还是有解决办法的。来源:https://linux.cn/article-...

  • 9

    从更新到现在,SwiftPM 令人诟病的一个问题就是无法在包里添加资源文件。这对于已经习惯于使用 CocoaPods 的开发者造成了很大的麻烦,当然目前 SwiftPM 差于 Cocoapods 不止这一点。SwiftPM 也意识到了这一点,从去年就可以看到 github 的 SwiftPM 对应仓库的有...

  • 6

    V2EX  ›  Windows Windows11 永远点不中托盘的小图标  

  • 3

    在 GNOME 中添加最小化和最大化按钮 作者:Abhishek Prakash 2023-10-18 11:01:07 系统 缺少了 GNOME 中的最小化按钮选项?下面教你如何轻松...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK