简述

QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。

现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。

内容

详细描述

要检查系统托盘是否存在在用户的桌面上,调用QSystemTrayIcon::isSystemTrayAvailable()静态函数。

要添加系统托盘项,首先,需要创建一个QSystemTrayIcon对象,并调用setContextMenu()为图标提供上下文菜单,然后,调用show()使其在系统托盘中可见。状态通知消息(“气球消息”)可以在任何时候使用showMessage()来进行显示。

当用户激活托盘图标时,activated()信号会被发射。

只有在X11上时,当发出一个tooltip请求时,QSystemTrayIcon会接收一个QEvent::ToolTip类型的QHelpEvent事件。此外,QSystemTrayIcon会接收QEvent::Wheel类型的滚轮事件。这些都是不支持任何其它平台。

共有类型

  • 枚举QSystemTrayIcon::ActivationReason:

    此枚举描述了系统托盘被激活的原因。

常量 描述
QSystemTrayIcon::Unknown 0 未知原因
QSystemTrayIcon::Context 1 系统托盘的上下文菜单请求
QSystemTrayIcon::DoubleClick 2 双击系统托盘
QSystemTrayIcon::Trigger 3 单击系统托盘
QSystemTrayIcon::MiddleClick 4 鼠标中键点击系统托盘
  • 枚举QSystemTrayIcon::MessageIcon:

    此枚举描述了显示气球消息时所显示的图标。

常量 描述
QSystemTrayIcon::NoIcon 0 无图标显示
QSystemTrayIcon::Information 1 一个信息图标显示
QSystemTrayIcon::Warning 2 一个标准的警告图标显示
QSystemTrayIcon::Critical 3 一个严重的警告图标显示

共有函数

  • QMenu * contextMenu() const
    返回系统托盘的当前上下文菜单。

  • void setContextMenu(QMenu * menu)
    设置指定菜单为系统托盘的上下文菜单。

    当用户通过点击鼠标请求系统托盘的上下文菜单时,菜单会弹出。

    在OS X中,一般转换为一个NSMenu,所以aboutToHide()信号不会发出。

    注意:系统托盘菜单并不对菜单有所有权,必须确保在恰当的时候删除菜单,例如:创造一个具有合适父对象的菜单。

  • QRect QSystemTrayIcon::geometry() const
    返回系统托盘图标在屏幕上的几何坐标。

  • QIcon icon() const

  • void setIcon(const QIcon & icon)

    icon : QIcon
    这个属性保存了系统托盘的图标。

    在Windows中,系统任务栏图标的大小是16×16;X11中,首选大小为22x22。必要时该图标将被调整到合适大小。

  • void setToolTip(const QString & tip)

  • QString toolTip() const

    toolTip : QString
    这个属性保存了系统托盘的提示信息。

    在一些系统中,tooltip的长度是有限的,在必要时tooltip将被截断。

  • bool isVisible() const
    返回系统托盘是否可见。

公有槽函数

  • void hide()
    隐藏系统托盘。

  • void setVisible(bool visible)
    设置系统托盘是否可见。

    设置为true或调用show()使系统托盘图标可见;设置为false或调用hide()隐藏它。

  • void show()
    显示系统托盘。

  • void showMessage(const QString & title, const QString & message, QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information, int millisecondsTimeoutHint = 10000)
    显示一个气球消息,使用所给出的标题、消息、图标和指定的时间,标题和消息必须是纯文本字符串。

消息可以被用户点击,当用户点击时发出messageClicked()信号 。

信号

  • void activated(QSystemTrayIcon::ActivationReason reason)
    当用户激活系统托盘图标,这个信号被发射。reason指定激活的原因, QSystemTrayIcon::ActivationReason列举了各种原因。

  • void messageClicked()
    当使用showMessage()显示的消息被用户点击时,此信号被发射。

    目前,这个信号不会在OS X中发射。

静态共有函数

  • bool isSystemTrayAvailable() [static]
    如果系统托盘可用,返回true;否则,返回false。

    如果系统盘是当前不可用,但以后变为可用,若QSystemTrayIcon可见,它就会自动在系统托盘中添加条目。

  • bool supportsMessages() [static]
    如果系统托盘支持气球消息,则返回true;否则,返回false。

示例

效果

源码

首先,自定义系统托盘需要使用的上下文菜单TrayMenu,其继承自QMenu,并通过addAction()为其添加需要的菜单项。

#include <QMenu>

class TrayMenu : public QMenu
{
Q_OBJECT public:
explicit TrayMenu(QWidget *parent = 0);
~TrayMenu(); signals:
// 自定义信号
void showWindow(); private:
// 添加菜单项
void initActions(); private:
QAction *m_pShowAction;
QAction *m_pSettingAction;
QAction *m_pHomePageAction;
QAction *m_pHelpAction;
QAction *m_pAboutAction;
QAction *m_pUpgradeAction;
QAction *m_pQuitAction;
};
TrayMenu::TrayMenu(QWidget *parent)
: QMenu(parent)
{ } TrayMenu::~TrayMenu()
{ } // 添加菜单项
void TrayMenu::initActions()
{
// 创建菜单项
m_pShowAction = new QAction(QIcon(":/icon/open"), QString::fromLocal8Bit("显示"), this);
m_pSettingAction = new QAction(QIcon(":/icon/setting"), QString::fromLocal8Bit("设置"), this);
m_pHomePageAction = new QAction(QIcon(":/icon/home"), QString::fromLocal8Bit("登录网页"), this);
m_pHelpAction= new QAction(QIcon(":/icon/help"), QString::fromLocal8Bit("帮助"), this);
m_pAboutAction = new QAction(QIcon(":/icon/about"), QString::fromLocal8Bit("关于"), this);
m_pUpgradeAction = new QAction(QIcon(":/icon/upgrade"), QString::fromLocal8Bit("检查更新"), this);
m_pQuitAction = new QAction(QIcon(":/icon/quit"), QString::fromLocal8Bit("退出"), this); // 添加菜单项
addAction(m_pShowAction);
addAction(m_pSettingAction);
addAction(m_pHomePageAction);
addSeparator();
addAction(m_pHelpAction);
addAction(m_pAboutAction);
addAction(m_pUpgradeAction);
addSeparator();
addAction(m_pQuitAction); // 连接信号-信号(仅列举连接显示窗口的信号)
connect(m_pShowAction, SIGNAL(triggered(bool)), this, SIGNAL(showWindow()));
}

然后,创建系统托盘QSystemTrayIcon,并通过setContextMenu()为其设置自定义的上下文菜单TrayMenu。

MainWindow::MainWindow(QWidget *parent)
: CustomWindow(parent)
{
// ... QSystemTrayIcon *pSystemTray = new QSystemTrayIcon(this);
TrayMenu *pTrayMenu = new TrayMenu(this); // 设置系统托盘的上下文菜单
pSystemTray->setContextMenu(pTrayMenu); // 设置系统托盘提示信息、托盘图标
pSystemTray->setToolTip(QString::fromLocal8Bit("我就是托盘"));
pSystemTray->setIcon(QIcon(":/icon/login")); // 连接信号槽
connect(pTrayMenu, SIGNAL(showWindow()), this, SLOT(showWindow()));
connect(pSystemTray , SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason))); // 显示系统托盘
pSystemTray->show(); // 显示系统托盘提示信息
pSystemTray->showMessage(QString::fromLocal8Bit("托盘标题"), QString::fromLocal8Bit("托盘显示内容"));
} // 显示窗体
void MainWindow::showWindow()
{
showNormal();
raise();
activateWindow();
} // 激活系统托盘
void MainWindow::onActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
// 单击托盘显示窗口
case QSystemTrayIcon::Trigger:
{
showNormal();
raise();
activateWindow();
break;
}
// 双击
case QSystemTrayIcon::DoubleClick:
{
// ...
break;
}
default:
break;
}
}

Qt之QSystemTrayIcon的更多相关文章

  1. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  2. QT系统托盘应用程序

    在QT中QSystemTrayIcon类提供了创建系统托盘程序的功能. QSystemTrayIcon类为系统托盘中的应用程序提供图标.现代操作系统通常会在桌面上提供一个称为系统托盘(system t ...

  3. QT 托盘 hover事件捕捉

    1. QSystemTrayIcon hover事件 参考:https://stackoverflow.com/questions/21795919/how-to-catch-the-mousehov ...

  4. Qt: 时钟Demo

    其实是一个很简单的Demo,可以编译了拿NSIS打包.最近在做富文本编辑器和补C++不记得的东西吧,项目遥遥无期. //clock.pro #----------------------------- ...

  5. Pyqt QSystemTrayIcon 实现托盘效果

    pyqt的托盘效果很好实现,在Pyqt的demo中有个例子 路径:PyQt4\examples\desktop\systray.py 今天我就仿这个Tray效果做效果 一. 创建UI trayicon ...

  6. 用Qt写软件系列四:定制个性化系统托盘菜单

    导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...

  7. Qt系统托盘

    Qt的系统托盘的使用,可比mfc中好多了!他封装了一个专门的QSystemTrayIcon类,建立系统托盘图标.其实在Qt提供的示例程序已经很不错了,$QTDIR\examples\desktop\s ...

  8. Qt学习总结-ui篇

    控件设置透明度: QGraphicsOpacityEffect *effect = new QGraphicsOpacityEffect(this); effect->setOpacity(0. ...

  9. Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)

    程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVI ...

随机推荐

  1. ALV详解:Function ALV(二)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. [C程序设计语言]第二部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Codeforces Round #249 (Div. 2) A题

    链接:http://codeforces.com/contest/435/problem/A   A. Queue on Bus Stop time limit per test 1 second m ...

  4. XAF学习笔记之 Upcasting

    通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下: 业务对象代码定义如下: using ...

  5. LINQ之路 4:LINQ方法语法

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression). LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方 ...

  6. [poj2286]The Rotation Game (IDA*)

    //第一次在新博客里发文章好紧张怎么办 //MD巨神早已在一个小时前做完了 The Rotation Game Time Limit: 15000MS Memory Limit: 150000K To ...

  7. 记CVTE2014年春季招聘实习生求职历程

    进度:目前已经过了网测 明天一面,好紧张,人生第一次实习面试.据说只有一分钟. 网测; 首先在http://exam.cvte.com/ 注册了账号,然后填写相关的个人信息,这里要仔细填写,因为它最后 ...

  8. jdk和eclipse位数不一致出错

    32位的eclipse无法打开:找不64位jdk6的jvm.dll文件(64位的没有这个文件).网上说法可以通过设置eclipse初始化文件xxx.ini改变方式: 直接换成了同位数的了,没去试了.

  9. Java实现分页数据获取CachedRowSet

    步骤 1.加载驱动 2.连接数据库 3.创建ResultSet 4.创建CacheRowSet 5.设置并获取分页数据 6.执行查询,展示数据 package ch13; import javax.s ...

  10. ORA-32004 参数设置过时的解决办法

    启动时报错: 查看日志: view /opt/oracle11g/app/db/diag/rdbms/yldev/yldev/trace/alert_yldev.log 原来是plsql_debug ...