首页 Qt 编写 native 风格的 Qt 程序(6)

编写 native 风格的 Qt 程序(6)

2 1.7K

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

一、显示内容修改

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

未修改的应用
被修改的应用

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

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("untitled [*]");

    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 系统虽然没有,但是有一个很类似的功能,就是在程序右上角可以浮现提示。

Windows 系统托盘
MacOS X 系统提示

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

四、获取存储位置

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

QString QDesktopServices::storageLocation(StandardLocation type)

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

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

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

2 评论

ko 2011年8月23日 - 15:05

非常感谢您的分享。
请教一个问题,望不吝赐教:
如何使用QT来实现标签式窗口,如同VS2010那样子?
我的应用一个典型的左树右图的MDI程序,且每个子窗口都有自己的工具栏按钮。

回复
DevBean 2011年8月23日 - 15:14

左侧的树结构可以使用 QDockWidget,类似浮动面板;右侧则直接使用 QMdiArea 作为 centerWidget 就好了吧。试试这样是不是符合要求呢?

回复

发表评论

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2