现在,我们将给出有关 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 开头的链接,那么就会自动调用系统默认的邮件处理程序。