让你的 Qt 桌面程序看上去更加 native(二):Style

简介:

我们先从 Style 说起。所谓 Style,也就是风格。可以理解成把程序一运行起来,第一眼看上去的的样子,也就是程序的第一印象。这种第一印象往往左右着用户的想法。例如,safari 原本是 Apple 在 MacOS 下的一款浏览器。后来,Apple 把它移植到 Windows 平台,但仍旧保留了 Apple 的外观。这样一来,尽管 safari 看起来很华丽,却与 Windows 的风格格格不入(下图出自 http://www.dtgeeks.com/journals/article/safari_for_windows/):

我们不能简单说这是 Apple 的设计失败之处。但是,如果你自己的程序留给用户的第一印象是这种样子的话,不知道用户能不能很好的接受呢?比如,你见过有几个 Windows 下的程序会把 title 放到标题栏的居中位置?这分明就是 Apple 的风格。在本文中,我们正是要避免出现这种情况。

这就是 Style,用户的第一印象。下面我们来看看 Qt 的表现:

上面是我在 Windows XP 下使用 designer 拖画出来的界面,然后原封不动拿到 Ubuntu 下编译出来的结果。我们很容易的看出哪一个是 XP 下的窗口,哪一个是 Ubuntu 下的窗口。在 Ubuntu 下,除了大小有问题之外,其他组件同系统很好的融合在一起。并且注意一下细节:Windows 下,OK 在 Cancel 前面,而 Ubuntu 下,OK 则在 Cancel 后面。使用 QDialogButtonBox,Qt 就已经能够为我们处理好这种细节,完全不需要我们自己考虑这种事情。

Qt 实际使用 QStyle 这个类来实现各个不同平台特有的行为。QStyle 主要完成的工作是,给出一个合适的系统外观;确定组件的大小和形状(例如上面的水平滑块的样式)。在这里,我们的建议是,不要强制指定一套风格。如果你需要手动编译 Qt,记得加上所需要的头文件,例如在 X11 平台下链接到 GTK+ 的库,而在 Windows 平台下 链接到 Windows SDK。另外,在编写自定义组件时,注意使用系统组件而不是自己用图片替代。先看下面两张截图(来自 Nokia 2009 开发者大会 PPT):

这两个相当熟悉的界面来自同一个程序:QtCreator。你能够分辨出它们分别来自什么平台吗?如果熟悉的话,我们可以很明显地从滚动条认出,第一个来自 Windows 平台,确切的说是 Windows Vista 或者 Windows 7;而第二个来自 MacOS。这是 Qt 为我们实现的,不是我们的重点。重点是细节:不同平台下,代码折叠的样式是不同的。这里只是为了强调一点:不要试图用图片来显示这种通用的组件。这里的代码折叠其实使用 tree 实现的,而 Windows,MacOS 下 tree 的图标显然是不同的。我们应该遵循系统约定,Windows 下的折叠起来的图标是 白色的,而 MacOS 下则是同展开时一样的灰色。那么,如何实现这一点呢?下面是关键代码:

;.=;.=::|::;if() {.|=::;}

style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, painer, this);

本文转自 FinderCheng 51CTO博客,原文链接:
http://blog.51cto.com/devbean/457349


相关文章
|
1天前
|
Web App开发 存储 Linux
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
63 0
|
1天前
【QT】读写.ini配置文件的程序实现
【QT】读写.ini配置文件的程序实现
|
1天前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
1天前
|
人工智能 编译器 C++
新版Qt6快速打包程序脚本
不知道啥时候Qt更新了,目前是6.7.0,项目默认的生成路径改了, 从 项目目录的同级目录 改为了 项目目录中的build目录, 之前的脚本也用不了了,所以用AI更新了一下脚本, 希望能帮到大家,方便快速打包程序到桌面。
41 9
|
1天前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
32 1
|
1天前
|
开发框架 Linux C++
Qt:强大的跨平台C++应用程序开发框架
Qt:强大的跨平台C++应用程序开发框架
45 3
|
1天前
|
数据可视化
实现Hello Qt 程序
实现Hello Qt 程序
|
1天前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
29 0
|
1天前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
45 8
C++ Qt开发:QTcpSocket网络通信组件
|
1天前
|
区块链
【qt】最快的开发界面效率——混合编程3
【qt】最快的开发界面效率——混合编程
13 1

推荐镜像

更多