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

继续前面的内容。本节还是有关开发跨平台应用程序的过程中一些需要注意的细节问题。

六、使用预定义快捷键

快捷键是现代应用程序不可缺少的部分,能够很好地提高用户工作效率。现在几个流行的操作系统上面,许多常用的快捷键已经有了约定俗成的按键组合。例如,Windows 和 Linux 上面,Ctrl+F 就是显示查找对话框,Mac OS X 下则是类似的按键。

对于我们的跨平台程序,我们就需要将我们程序的快捷键设置为与平台一致的。好在 Qt 也为我们提供了类似的 API,那就是QKeySequence类。这个类提供了一系列标准快捷键组合,适用于不同的平台。我们所需要注意的,就是尽可能使用这种快捷键的标准组合,并且注意在不同平台进行很好的测试。下面就是简单的使用代码:

QAction action;
action.setShortcuts(QKeySequence::Find);

或者,我们也可以使用一个循环,来遍历所有的预定义快捷键:

QList keys = QKeySequence::keyBindings(QKeySequence::NextChild);
foreach (QKeySequence key, keys) {
    printOut(key.toString(QKeySequence::PortableText));
}

七、使用一致的图标

图标是一个应用程序不可或缺的部分,可以让程序更漂亮。好的图标也可以达到“望图生义”,看到图标就知道大体是什么功能。

同一个应用程序图标风格应该是一致的。不要让不同风格的图标出现在一个程序中,例如写实风格和卡通风格的混用,这只会让你的程序看起来很花哨,一点儿都不专业,往往还会引起用户的反感。现在网上有很多风格的图标,我们可以恰当地选取其中一套,而不是这里拿一个那里找一个。

oxygen 主题图标

http://www.oxygen-icons.org

tango 主题图标

http://tango.freedesktop.org

对于 Linux GNOME 或者 KDE 平台,X Window 遵循 freedesktop.org 制定的标准。因此,我们可以利用 Qt 代码直接获取系统主题中存在的图标。注意,这一函数是在 Qt 4.6 引入的。早期版本的 Qt 可以利用这个实现。例如:

QIcon::fromTheme("document-edit");
QIcon::fromTheme("document-edit", QIcon("document.png"));

第一行代码是从主题中取名为 document-edit 的图标,并返回该图标的QIcon对象。第二行是取 document-edit 图标,如果找不到,则使用 document.png。显然,第二行代码容错性更好,是我们所推荐的写法。我们可以在这里找到 freedesktop.org 制定的标准,从而找到主题中一般会有哪些图标。

利用这种技术,我们可以使用同一段代码,编译出不同平台图标的应用程序:

GNOME 上面的图标

KDE 上面的图标

八、定义QAction的优先级

Qt 4.6 引入的QAction优先级的概念。我们可以使用QAction::setPriority(QAction::Priority)函数
QAction定义高、中、低等优先级。

设置优先级有助于我们对动作有更好的控制。另外,有一种情况我们可以借助优先级实现:

QAction 优先级

上图中,我们对于动作设置有一个预览。这个预览里面的QAction应该使用更低优先级,以便在预览窗口中不会对这些QAction有所响应。

九、菜单中的图标

菜单项前面可以添加图标。这一点是使用QAction::setIcon()实现的。但是,如果我们将这个QAction放在菜单项中,Windows 和 KDE 平台会显示出图标;Mac OS X 则不会;GNOME 则根据设置与否决定是否显示。不过,这一点也是由 Qt 帮我们完成的,我们不需要为此编写特别的代码。

我们可以使用QAction::setIconVisibleInMenu(bool)或者QApplication::setAttribute(Qt::AA_DontShowIconsInMenus)来覆盖系统默认设置。

十、设置对话框的行为

所谓设置对象框,就是用于设置程序属性的对话框。当我们设置完程序属性并确定时,不同平台会有不同的行为:在 GNOME 和 Mac OS X 上,设置结束后会立即应用到程序上面;Windows 和 KDE 则需要根据用户点击的是“应用”还是“取消”,决定是否应用设置项。

十一、MDI

MDI 窗口看起来很方便,但实际它是一个历史遗留下来的现象。现代操作系统越来越多地倾向于放弃 MDI 形式的窗口。Mac OS X 和 GTK+ 根本不支持 MDI。对于 Microsoft,它认为,SDI 已经适合于绝大多数产品级别的应用程序。MDI 虽然还在使用,但是已经不适合于今天的用户和操作系统。所以,如果你计划开发自己的应用程序,请谨慎使用 MDI。

Windows 上面的 MDI 程序

Leave a Reply