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

  • 相关阅读:
    正则表达式
    HashTable与HashMap的区别
    求解连续子数组乘积的最大值
    求解N个值中最大的k个数,N远大于k
    C++权限修饰符
    DBSCAN算法
    【leetcode】1318. Minimum Flips to Make a OR b Equal to c
     【leetcode】1317. Convert Integer to the Sum of Two No-Zero Integers
    【leetcode】1316. Distinct Echo Substrings
    【leetcode】1315. Sum of Nodes with Even-Valued Grandparent
  • 原文地址:https://www.cnblogs.com/dongxiao/p/2544364.html
Copyright © 2011-2022 走看看