zoukankan      html  css  js  c++  java
  • 让你的 Qt 桌面程序看上去更加 native(六):跨平台技术

    让你的 Qt 桌面程序看上去更加 native(六):跨平台技术

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/516696
     
     

    现在,我们将给出有关 Qt 的一些跨平台技术。利用这些技术,能够让你的应用程序看起来更加符合平台的习惯。这次内容不是一个完整的例子,而是很多小的条目,希望大家了解到这些简单的 tip,从而可以方便的应用到自己的程序中。很多 GUI 的问题就在于一个知道不知道。你知道,就可以很方便的实现,不知道,恐怕就会变得很笨拙。今天的目的,不在于例子,而在于让你“知道”。

    一、显示内容修改

    有时,我们需要制作一个文本编辑器。一般文本编辑器如果内容有所修改,会在标题栏有一个提示,比如增加一个 * 等。这种功能是 Qt 已经为我们提供好的。例如:

    当我们在文本框中输入文字时,窗口会显示一个 *,表明内容已经被修改,提供用户保存。其实这种实现很简单。Qt 的 setWindowTitle() 函数有一个占位符,可以预留出 * 的位置。

    1. MainWindow::MainWindow(QWidget *parent) : 
    2.     QMainWindow(parent), 
    3.     ui(new Ui::MainWindow) 
    4.     ui->setupUi(this); 
    5.     this->setWindowTitle("untitled [*]"); 
    6.  
    7.     connect(ui->textEdit->document(), SIGNAL(modificationChanged(bool)), SLOT(setWindowModified(bool))); 

    类似于上面的代码。窗口标题设置为 untitled [*],而 [*] 就是将来 * 出现的地方。最后,我们将 QTextEdit 的内容改变信号同 setWindowModified() 槽连接起来。只要 setWindowModified() 设置为 true,那么,这个内容改编的 * 就会自动为我们显示出来。

    二、让程序提醒用户

    通常我们会有这么一种需求:我们的程序只能运行一个实例。当用户已经运行之后,如果用户试图再次运行同一个程序,则会让程序有一个提醒功能。在 Windows 下是任务栏的窗口图标闪烁, Mac 下则是让 Dash 上的图标跳动起来:

    这种功能是与平台相关的,如果我们要编写这样的程序,不得不调用系统 API。好在 Qt 也为我们提供了这一功能,那就是 QApplication::alert() 函数。这个函数是 QApplication 类的一个 static 函数,因此,我们可以在任何位置使用。这个函数的作用就是让你的程序有这样的一种提醒功能。

    三、系统托盘

    现代操作系统一般都会有系统托盘这个功能区。Windows、KDE 等等都有,Mac 系统虽然没有,但是有一个很类似的功能,就是在程序右上角可以浮现提示。

    要实现这个功能,Qt 为我们提供了 QSystemTrayIcon 类。具体的用法,大家可以参考文档。不过需要提醒一点的是,Mac 的图标必须是黑白两色的。

    四、获取存储位置

    如果我们想使用自己的程序保存文件,一般都要有一个默认的存储位置。一般来说,Windows 的程序往往默认是在我的文档里面。我们如何获取这个存储路径呢?Qt 有一个很方便的 QDesktopServices 类。这个类里面有一个 static 的函数:

    1. QString QDesktopServices::storageLocation(StandardLocation type) 

    利用这个函数,我们就可以获得比如桌面、音乐、缓存等等的默认路径。这样,我们的程序就可以和系统统一起来了。

    五、调用系统默认程序打开链接

    有时候我们希望用系统默认程序打开链接。比如,调用默认浏览器打开网页,调用默认邮件客户端发送邮件。要实现这种功能,我们就要使用 QDesktopServices::openUrl() 这个函数。如果你要打开以 mailto 开头的链接,那么就会自动调用系统默认的邮件处理程序。

    本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/516696

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/dongxiao/p/2544364.html
Copyright © 2011-2022 走看看