Qt之程序最小化托盘显示及操作
来源:互联网 发布:keep软件下载 编辑:程序博客网 时间:2024/05/16 06:25
1.功能说明
对于GUI程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
2.使用的类
主要使用的此类:QSystemTrayIcon。
其中QSystemTrayIcon是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击,双击,或wheel操作(好像只对X11系统有用),显示指定消息,显示菜单等。
此类中有两个枚举类型,分别如下:
enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由
enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片
常量值描述QSystemTrayIcon::NoIcon0不显示图标QSystemTrayIcon::Information1显示信息图标QSystemTrayIcon::Warning2显示告警图标QSystemTrayIcon::Critical3显示致命图标3.QSystemTrayIcon常用函数
void setIcon(const QIcon& icon)
设置系统托盘的图标
void setToolTip(const QString &tip)
设置鼠标放到图标上的提示文字
void setContextMenu(QMenu* menu);
设置当点击图标弹出的菜单
void show()
显示系统托盘图标
4.代码
1.实现程序托盘显示
a)新建一个QWidget程序,在界面上放入一个QPushButton,text改为“最小化”,如下图:
b)给工程加入Qt Resource资源文件,添加一个在托盘显示的icon图片,如图:
c)给a中的QPushButton,建立槽函数,在槽函数内实现程序最小化托盘显示
<code class="hljs lasso has-numbering"><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_pushButton_clicked</span>(){ <span class="hljs-comment">//隐藏程序主窗口</span> this<span class="hljs-subst">-></span>hide(); <span class="hljs-comment">//新建QSystemTrayIcon对象</span> mSysTrayIcon <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> QSystemTrayIcon(this); <span class="hljs-comment">//新建托盘要显示的icon</span> QIcon icon <span class="hljs-subst">=</span> QIcon(<span class="hljs-string">"../IMClient/Resources/GG64.png"</span>); <span class="hljs-comment">//将icon设到QSystemTrayIcon对象中</span> mSysTrayIcon<span class="hljs-subst">-></span>setIcon(icon); <span class="hljs-comment">//当鼠标移动到托盘上的图标时,会显示此处设置的内容</span> mSysTrayIcon<span class="hljs-subst">-></span>setToolTip(QObject<span class="hljs-tag">::trUtf8</span>(<span class="hljs-string">"测试系统托盘图标"</span>)); <span class="hljs-comment">//在系统托盘显示此对象</span> mSysTrayIcon<span class="hljs-subst">-></span>show();}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>
运行程序,点击按钮最小化,可以在系统托盘看到此图标,鼠标移到上面,可以见看见代码中所设的”测试系统托盘图标”文本,如图:
2.实现托盘图标操作
最小化后显示在系统托盘内,此时除了在任务管理器中结束此程序,无法再做其他操作,而我们还想实现双击图标显示主界面,单击图标弹出菜单等实现其他操作,此时,就需要使用QSystemTrayIcon::ActivationReason属性了。
a)给QSystemTrayIcon对象添加信号为activated(QSystemTrayIcon::ActivationReason)的槽函数
b)在槽函数内,对双击事件,显示主窗口界面
代码如下:
<code class="hljs lasso has-numbering"><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_pushButton_clicked</span>(){ <span class="hljs-comment">//隐藏主窗口</span> this<span class="hljs-subst">-></span>hide(); <span class="hljs-attribute">...</span><span class="hljs-attribute">...</span> <span class="hljs-comment">//当鼠标移动到托盘上的图标时,会显示此处设置的内容</span> mSysTrayIcon<span class="hljs-subst">-></span>setToolTip(QObject<span class="hljs-tag">::trUtf8</span>(<span class="hljs-string">"测试系统托盘图标"</span>)); <span class="hljs-comment">//给QSystemTrayIcon添加槽函数</span> connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon<span class="hljs-tag">::ActivationReason</span>)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon<span class="hljs-tag">::ActivationReason</span>))); <span class="hljs-comment">//在系统托盘显示此对象</span> mSysTrayIcon<span class="hljs-subst">-></span>show();}<span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_activatedSysTrayIcon</span>(QSystemTrayIcon<span class="hljs-tag">::ActivationReason</span> reason){ switch(reason){ <span class="hljs-keyword">case</span> QSystemTrayIcon<span class="hljs-tag">::Trigger</span>: <span class="hljs-comment">//单击托盘图标</span> break; <span class="hljs-keyword">case</span> QSystemTrayIcon<span class="hljs-tag">::DoubleClick</span>: <span class="hljs-comment">//双击托盘图标</span> <span class="hljs-comment">//双击后显示主程序窗口</span> this<span class="hljs-subst">-></span>show(); break; default: break; }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li></ul>
程序最小化后,双击托盘图标,程序的主界面可以显示了。
最后再来考虑在单击系统托盘图标时,显示菜单功能。根据上面描述,思路很明确了,如下:
a)新建一个QMenu menu
b)将menu通过QSystemTrayIcon的setContextMenu函数设置到QSystemTrayIcon对象中
再来看代码实现:
在头文件中新增:
<code class="hljs r has-numbering"> QMenu *mMenu; QAction *mShowMainAction; QAction *mExitAppAction; <span class="hljs-keyword">...</span> public: void createActions(); void createMenu(); <span class="hljs-keyword">...</span> private slots: <span class="hljs-keyword">...</span> void on_showMainAction(); void on_exitAppAction();</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>
在cpp中实现:
<code class="hljs lasso has-numbering"><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::createActions</span>(){ mShowMainAction <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> QAction(QObject<span class="hljs-tag">::trUtf8</span>(<span class="hljs-string">"显示主界面"</span>),this); connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction())); mExitAppAction <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> QAction(QObject<span class="hljs-tag">::trUtf8</span>(<span class="hljs-string">"退出"</span>),this); connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));}<span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::createMenu</span>(){ mMenu <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> QMenu(this); <span class="hljs-comment">//新增菜单项---显示主界面</span> mMenu<span class="hljs-subst">-></span>addAction(mShowMainAction); <span class="hljs-comment">//增加分隔符</span> mMenu<span class="hljs-subst">-></span>addSeparator(); <span class="hljs-comment">//新增菜单项---退出程序</span> mMenu<span class="hljs-subst">-></span>addAction(mExitAppAction); <span class="hljs-comment">//把QMenu赋给QSystemTrayIcon对象</span> mSysTrayIcon<span class="hljs-subst">-></span>setContextMenu(mMenu);}<span class="hljs-comment">/** 当在系统托盘点击菜单内的显示主界面操作*/</span><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_showMainAction</span>(){ this<span class="hljs-subst">-></span>show();}<span class="hljs-comment">/** 当在系统托盘点击菜单内的退出程序操作*/</span><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_exitAppAction</span>(){ exit(<span class="hljs-number">0</span>);}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li></ul>
然后
<code class="hljs lasso has-numbering"><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_pushButton_clicked</span>(){ <span class="hljs-attribute">...</span><span class="hljs-attribute">...</span> <span class="hljs-comment">//给QSystemTrayIcon添加槽函数</span> connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon<span class="hljs-tag">::ActivationReason</span>)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon<span class="hljs-tag">::ActivationReason</span>))); <span class="hljs-comment">//建立托盘操作的菜单</span> createActions(); createMenu(); <span class="hljs-comment">//在系统托盘显示此对象</span> mSysTrayIcon<span class="hljs-subst">-></span>show();}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>
最后再看看消息球的使用
<code class="hljs lasso has-numbering"><span class="hljs-literal">void</span> MainWindow<span class="hljs-tag">::on_activatedSysTrayIcon</span>(QSystemTrayIcon<span class="hljs-tag">::ActivationReason</span> reason){ switch(reason){ <span class="hljs-keyword">case</span> QSystemTrayIcon<span class="hljs-tag">::Trigger</span>: <span class="hljs-comment">//显示消息球,1s后自动消失</span> <span class="hljs-comment">//第一个参数是标题</span> <span class="hljs-comment">//第二个参数是消息内容</span> <span class="hljs-comment">//第三个参数图标</span> <span class="hljs-comment">//第四个参数是超时毫秒数</span> mSysTrayIcon<span class="hljs-subst">-></span>showMessage(QObject<span class="hljs-tag">::trUtf8</span>(<span class="hljs-string">"Message Title"</span>), QObject<span class="hljs-tag">::trUtf8</span>(<span class="hljs-string">"欢迎使用此程序"</span>), QSystemTrayIcon<span class="hljs-tag">::Information</span>, <span class="hljs-number">1000</span>); break; <span class="hljs-keyword">case</span> QSystemTrayIcon<span class="hljs-tag">::DoubleClick</span>: this<span class="hljs-subst">-></span>show(); break; default: break; }}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul>
关于系统托盘操作的笔记就记录到此了,最后是完整代码的实现。
<code class="hljs cs has-numbering"><span class="hljs-preprocessor">#ifndef MAINWINDOW_H</span><span class="hljs-preprocessor">#<span class="hljs-keyword">define</span> MAINWINDOW_H</span><span class="hljs-preprocessor">#include <QMainWindow></span><span class="hljs-preprocessor">#include <QSystemTrayIcon></span><span class="hljs-preprocessor">#include <QMenu></span><span class="hljs-preprocessor">#include <QAction></span>namespace Ui {class MainWindow;}class MainWindow : <span class="hljs-keyword">public</span> QMainWindow{ Q_OBJECT<span class="hljs-keyword">public</span>: <span class="hljs-keyword">explicit</span> <span class="hljs-title">MainWindow</span>(QWidget *parent = <span class="hljs-number">0</span>); ~MainWindow();<span class="hljs-keyword">public</span>: QSystemTrayIcon *mSysTrayIcon; QMenu *mMenu; QAction *mShowMainAction; QAction *mExitAppAction;<span class="hljs-keyword">public</span>: <span class="hljs-keyword">void</span> <span class="hljs-title">createActions</span>(); <span class="hljs-keyword">void</span> createMenu();<span class="hljs-keyword">private</span> slots: <span class="hljs-keyword">void</span> <span class="hljs-title">on_pushButton_clicked</span>(); <span class="hljs-keyword">void</span> on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason); <span class="hljs-keyword">void</span> on_showMainAction(); <span class="hljs-keyword">void</span> on_exitAppAction();<span class="hljs-keyword">private</span>: Ui::MainWindow *ui;};<span class="hljs-preprocessor">#<span class="hljs-keyword">endif</span> // MAINWINDOW_H</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li></ul>
<code class="hljs vala has-numbering"><span class="hljs-preprocessor">#include "mainwindow.h"</span><span class="hljs-preprocessor">#include "ui_mainwindow.h"</span><span class="hljs-preprocessor">#include <QIcon></span>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(<span class="hljs-keyword">new</span> Ui::MainWindow){ ui->setupUi(<span class="hljs-keyword">this</span>);}MainWindow::~MainWindow(){ delete ui;}<span class="hljs-keyword">void</span> MainWindow::on_pushButton_clicked(){ <span class="hljs-comment">//隐藏主窗口</span> <span class="hljs-keyword">this</span>->hide(); <span class="hljs-comment">//新建QSystemTrayIcon对象</span> mSysTrayIcon = <span class="hljs-keyword">new</span> QSystemTrayIcon(<span class="hljs-keyword">this</span>); <span class="hljs-comment">//新建托盘要显示的icon</span> QIcon icon = QIcon(<span class="hljs-string">"../IMClient/Resources/GG64.png"</span>); <span class="hljs-comment">//将icon设到QSystemTrayIcon对象中</span> mSysTrayIcon->setIcon(icon); <span class="hljs-comment">//当鼠标移动到托盘上的图标时,会显示此处设置的内容</span> mSysTrayIcon->setToolTip(QObject::trUtf8(<span class="hljs-string">"测试系统托盘图标"</span>)); <span class="hljs-comment">//给QSystemTrayIcon添加槽函数</span> connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),<span class="hljs-keyword">this</span>,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason))); <span class="hljs-comment">//建立托盘操作的菜单</span> createActions(); createMenu(); <span class="hljs-comment">//在系统托盘显示此对象</span> mSysTrayIcon->show();}<span class="hljs-keyword">void</span> MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason){ <span class="hljs-keyword">switch</span>(reason){ <span class="hljs-keyword">case</span> QSystemTrayIcon::Trigger: mSysTrayIcon->showMessage(QObject::trUtf8(<span class="hljs-string">"Message Title"</span>), QObject::trUtf8(<span class="hljs-string">"欢迎使用此程序"</span>), QSystemTrayIcon::Information, <span class="hljs-number">1000</span>); <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> QSystemTrayIcon::DoubleClick: <span class="hljs-keyword">this</span>->show(); <span class="hljs-keyword">break</span>; <span class="hljs-keyword">default</span>: <span class="hljs-keyword">break</span>; }}<span class="hljs-keyword">void</span> MainWindow::createActions(){ mShowMainAction = <span class="hljs-keyword">new</span> QAction(QObject::trUtf8(<span class="hljs-string">"显示主界面"</span>),<span class="hljs-keyword">this</span>); connect(mShowMainAction,SIGNAL(triggered()),<span class="hljs-keyword">this</span>,SLOT(on_showMainAction())); mExitAppAction = <span class="hljs-keyword">new</span> QAction(QObject::trUtf8(<span class="hljs-string">"退出"</span>),<span class="hljs-keyword">this</span>); connect(mExitAppAction,SIGNAL(triggered()),<span class="hljs-keyword">this</span>,SLOT(on_exitAppAction()));}<span class="hljs-keyword">void</span> MainWindow::createMenu(){ mMenu = <span class="hljs-keyword">new</span> QMenu(<span class="hljs-keyword">this</span>); mMenu->addAction(mShowMainAction); mMenu->addSeparator(); mMenu->addAction(mExitAppAction); mSysTrayIcon->setContextMenu(mMenu);}<span class="hljs-keyword">void</span> MainWindow::on_showMainAction(){ <span class="hljs-keyword">this</span>->show();}<span class="hljs-keyword">void</span> MainWindow::on_exitAppAction(){ exit(<span class="hljs-number">0</span>);}</code>
FROM: http://blog.csdn.net/zhuyunfei/article/details/51433822
- Qt之程序最小化托盘显示及操作
- Qt之程序最小化托盘显示及操作
- Qt之程序最小化托盘显示及操作
- MFC程序最小化托盘显示
- C# 托盘程序 实例 双击显示窗体,最小化到托盘
- C# 托盘程序 实例 双击显示窗体,最小化到托盘
- 程序最小化到托盘
- 程序最小化到托盘
- Qt开发:最小化到托盘
- VC最小化程序到托盘
- VC最小化程序到托盘
- VC程序最小化到托盘
- VC最小化程序到托盘
- VC最小化到托盘程序
- MFC程序最小化到托盘
- MFC最小化程序到托盘
- MFC最小化程序到托盘
- MFC程序最小化到托盘
- 错误:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
- Codeforces712B【= =】
- 好程序员的标准
- Swift语法07.数组
- java面试笔试题
- Qt之程序最小化托盘显示及操作
- BZOJ1260: [CQOI2007]涂色paint 区间DP
- 【STL】vector函数用法总结
- mybatis的4种Mapper注册方式
- PageRank
- Inside SQLite Section 1.1 应用实例
- 正则表达式入门知识+用它实现在一个网页中获取所有的链接地址
- 设计模式之禅——责任链模式
- ZBar与ZXing使用后感觉