[Qt Topic] – 全局热键、托盘功能和随机启动


全局热键、托盘功能和随机启动


作者:Jason Lee

日期:2010-04-24

平台:Qt SDKv2010.02.1 + Windows Xp

声明:文章作者仅在Intel软件网络CSDN博客发表本文,如有转载,请注明出处

 

[1]全局热键

Qt事件模型提供了这么一个功能:在一个QObject实例遇到属于它的事件之前,可以通过设置另外一个QObject实例来监视(过滤)这些事件。我们称监视事件的对象为事件过滤器,即eventFilter

通过QObjecteventFilterinstallEventFilter两个函数可以实现事件过滤的功能。前者的原型如下:


该函数是一个虚函数,所以应该由子类(即用户自定义的继承于 QObject 类)来重新实现。实现了该虚函数的对象可以作为一个事件过滤器被安装到指定对象上,目标对象通过使用 installEventFilter 来安装事件过滤器:


上述是一段引言,现在回到全局热键的问题。

要在 windows 下实现捕获全局热键的功能,自然免不了调用 windows API ,我们首先通过调用 API 向系统注册全局热键,然后通过事件过滤器来处理热键消息。

注册全局热键的 API 如下:

第一个参数是用来接收热键消息的窗体句柄,我们将其设置为 Qt 中窗口 ID ;第二个参数是要设置的热键标识;第三个参数代表组合键;第四个参数是热键的虚拟键值。更详细的信息可参阅 MSDN

当向系统注册热键成功后,就需要事件过滤器的功能了。由于这里的事件是来自于 windows ,所以相应的事件过滤器就有点不同——需要使用 winEventFilter


该成员函数也是一个虚函数,通过该过滤器可以处理 Qt 外部的消息。并且由于该函数是 QCoreApplication 的成员,要重写该虚函数就要求我们自定义一个 QCoreApplication 的子类:

最后我们在 winEventFilter 中处理热键消息,并通过自定义的热键信号来连接目标槽。在本实例中,通过热键 F10 F11 来切换一个 checkBox 的选中状态。并且因为是全局热键,所以即便程序失去焦点,也可以响应到热键消息。

 

[2] 托盘功能

Qt 中的托盘功能是通过 QSystemTrayIcon 类实现的。同时,该类还可以通过 setContextMenu 成员函数与 QMenu 类结合来产生一个上下文菜单。以下是一段具体代码:

系统托盘通过设置上下文菜单后,可以添加各种动作,从而产生一些指定行为。除此之外,如果我们要更生动地实现系统托盘图标的显隐,比如点击关闭或者最小化按钮后将程序隐藏到系统托盘中,而非实际关闭应用程序,可以通过结合 closeEvent 或者结合 changeEvent 来判断 windowState 来重写当用户点击关闭或者最小化按钮时的处理代码。

另外,托盘图标可以做到的更生动的事是当有需要的时候可以弹出一个气泡消息提示用户,比如告知用户某项下载任务已经完成。该功能则可以通过 QSystemTrayIcon 的成员函数 showMessage 来实现。

托盘功能的效果图如下:

 

[3] 随机启动

Windows 下实现随机启动的功能,一般都是通过操作注册表来实现的。我们可以考虑的 API 函数有:

       可以通过结合第一个参数 hKey 和第二个参数 lpSubKey 来指定要在注册表哪个位置上创建一个新项,并且由倒数第二个参数 phkResult 来指向获得的项。其它的具体参数含义详见 MSDN 。(项的解释,来源于中文版的 windows 操作系统中的注册表)

       显然,同样是通过 hKey lpSubKey 来指定路径,然后通过 phkResult 来指向获得的项。

       当我们打开一个项时,我们就获得了该项的句柄。接着对该项进行操作时,比如修改某个值的内容,就需要该项的句柄作为第一个参数 hKey 。第二个参数是值名,如果项中不存在该值名则以改名添加一个新值到该项中。结合图说明可以更加具体:

截止到 Run 是随机启动项在注册表中所处的位置。

而新建项就是左边这般模样。

以上就是项中的值,有多种类型。我们可以通过往 Run 项添加新值来新增一个自启动项目。

操作结束后,需要记得关闭该项。

 

[ 后记 ] 我本来的预想示例程序是通过热键来切换 checkBox 的选中状态,进而控制程序是否随机启动,并且实现下系统托盘的简单功能。但写到这里才发现已经凌晨,明天又有事情,所以目前只实现了全局热键和系统托盘的功能,而对于随机启动,只放了两个空函数在代码中还没来得及写,只是对相关 API 进行了一番粗略概览。

希望大家不吝赐教。晚安 & 早安!

本实例源码请见:http://download.csdn.net/source/2281281

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Qt 为我们提供了一种简单的方法,可以在应用程序启动时将其最小化到系统托盘中。 首先,我们需要在项目中包含 `<QSystemTrayIcon>` 头文件。接下来,在创建 `QApplication` 实例之前,我们可以设置一个标志位以指示应用程序将被最小化到托盘。 例如,我们可以在 `main.cpp` 文件中添加以下代码: ```c++ #include <QApplication> #include <QSystemTrayIcon> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 设置标志位以指示应用程序将被最小化到托盘 bool startMinimizedToTray = true; // 创建托盘图标 QSystemTrayIcon *trayIcon = new QSystemTrayIcon(QIcon("icon.png")); // 将应用程序最小化到系统托盘中 if (startMinimizedToTray) { a.setWindowIcon(QIcon("icon.png")); trayIcon->show(); } // 其他应用程序逻辑 return a.exec(); } ``` 在上述代码中,我们首先设置了一个 `startMinimizedToTray` 标志位,用于指示应用程序是否将被最小化到托盘。然后,我们创建了一个 `QSystemTrayIcon` 对象并设置了一个应用程序图标(在此例中,我们假设有一个名为 "icon.png" 的图标文件)。最后,如果 `startMinimizedToTray` 标志位为真,则将应用程序的图标显示在系统托盘中。 这样,当我们运行应用程序时,它将首先在系统托盘中显示图标,而不是在任务栏中。用户可以通过单击托盘图标来恢复应用程序的正常窗口。 ### 回答2: Qt是一个跨平台的应用程序框架,可以用于开发图形用户界面(GUI)程序。启动最小化到托盘是一种常见的功能,允许程序在启动时最小化到任务栏的系统托盘区域。 要实现这个功能,首先需要引入QSystemTrayIcon类,这个类提供了操作系统托盘的接口。然后在程序的主窗口中创建一个QSystemTrayIcon对象。 接下来,可以使用hide()函数将主窗口隐藏,并使用showMinimized()函数将窗口最小化。然后,调用setContextMenu()函数,为托盘图标设置一个菜单,可以在用户右键单击托盘图标时显示。菜单可以包含恢复窗口、退出程序等选项。 在程序的槽函数中,可以监听相关的事件,如托盘图标被双击、菜单项被点击等。当用户双击托盘图标时,可以调用showNormal()函数将窗口恢复正常显示。当用户选择退出程序时,可以调用QApplication的quit()函数退出程序。其他的一些槽函数可以根据需要来定义。 最后,在程序的main函数中实例化QApplication对象,并将程序的主窗口作为参数传递给QSystemTrayIcon的构造函数。然后,调用show()函数显示主窗口。 通过以上的步骤,程序在启动时会先最小化到系统托盘区域,用户可以通过托盘图标进行操作。这样做的好处是不会占用用户的任务栏空间,而且用户可以随时将窗口恢复显示,方便快捷。 ### 回答3: 要在Qt中实现将应用程序启动最小化到系统托盘,可以按照以下步骤进行操作: 1. 首先,需要在应用程序中添加`QSystemTrayIcon`类的实例,该类提供了访问系统托盘图标的功能。可以在应用程序的主窗口类中添加一个成员变量来保存`QSystemTrayIcon`对象。 2. 创建一个菜单,用于点击托盘图标时显示的菜单项。可以使用`QMenu`和`QAction`类来创建并添加菜单项。 3. 接下来,在应用程序的`main()`函数中,需要检查当前操作系统是否支持系统托盘功能。如果不支持,则不进行后续操作。 4. 当应用程序窗口关闭时,需要将其最小化到系统托盘。可以通过重写应用程序类的`closeEvent()`函数来实现。在该函数中,需要将主窗口隐藏,并设置`QSystemTrayIcon`对象的图标和菜单。 5. 最后,在`QSystemTrayIcon`的槽函数中处理托盘图标的点击事件。可以根据具体需求来实现不同的功能,比如恢复应用程序窗口、退出应用程序等。 需要注意的是,启动最小化到系统托盘功能在不同平台上的实现方式可能有所不同。因此,在进行具体实现时,需要根据目标平台和Qt版本选择适当的方法和事件。 以上是实现在Qt中将应用程序启动最小化到系统托盘的一般步骤。具体的实现方式还需要根据应用程序的具体需求和平台特性进行调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值