让你的 Qt 桌面程序看上去更加 native(四):style sheet

简介:

临近春节,更新也慢了许多。今天再来写一篇,不知道会不会是春节前的最后一篇了。豆子先祝大家新春愉快!

我们知道,HTML 仅仅被定义为一种内容布局的语言。也就是说,HTML 应该做的,是告诉浏览器,这个东西应该放在这里,那个东西应该放在那里。至于这些东西该怎么显示,例如,用红色还是用蓝色,这样的显示的定义应该交给 CSS 去做。所以,在新近版本的 HTML 中,font、color 这样的标签和属性已经不被推荐使用了。同样,在 Qt 中也有这么一个样式表,被称为 style sheet——这其实和 CSS 如出一辙。不仅名字相似,就连语法之类也相当雷同。

style sheet 虽然很好用,但是,我们应该提出几个需要注意的地方。style sheet 应该被小心使用,因为它会打破系统正常的 look and feel。还记得我们前面提到的那个同普通 Windows 程序格格不入的 safari 吗?所以在使用 style sheet 时应该尽量选用系统调色板,而不是自己定义一个另类的颜色。

关于 style sheet 语法更详细的手册,我们可以到这里去查看。当然,如果你安装的是 mingw 版本的 Qt(Windows 平台),这个文档已经在 Qt Help 里面了。在这里,我们不去详细介绍具体的语法细节,而是专注于如何正确使用 style sheet。所以,如果你有的语法看不懂,请自行查阅文档了解。

自己定义 label 的颜色固然很简单,请看以下代码:

 
  1. #include <QtGui> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     QApplication app(argc, argv); 
  5.  
  6.     QLabel label; 
  7.     label.setText("Hello, style sheet!"); 
  8.     label.setStyleSheet(QString("color:red")); 
  9.     label.show(); 
  10.  
  11.     return app.exec(); 

我们将 label 的颜色使用 style sheet 定义为红色,运行起来如下图所示:

这种预定义的颜色很简单,然而,如果我想用个系统颜色呢?比如,我希望是系统高亮的颜色?难道还得自己去找高亮色的 RGB 值吗?正确的做法是,使用系统调色板,如下代码所示:

 
  1. label.setStyleSheet(QString("color:palette(highlight)")); 

这样,我们直接从系统调色板中得到高亮色,即便是不同的系统,也不需要修改任何代码。以下是在 Windows 7 上面的运行结果:

即使你必须使用自定义颜色,也不应该将颜色硬编码。而是使用一种变通的方式,例如:

 
  1. QColor color(128, 200, 128); 
  2. label.setStyleSheet(QString("color:%1").arg(color.name())); 

这样做的好处是,你可以很方便地让用户选择颜色,存入配置文件,并且在以后的启动中从配置文件中读取 color 的值,而不需要修改代码。

使用 style sheet 可以做出很漂亮的显示效果。由于使用 style sheet 要比 前面说的自定义 style 简单得多,因此,我们还是建议多多使用这一技术。下面,我们制作一个苹果风格的前进/后退按钮。效果如下:

为了制作这一按钮,我们需要以下四幅图片:

按照从上向下的顺序分别命名为 btn_left.png, btn_left_pressed.png, btn_right.png 和 btn_right_pressed.png。然后,我们用下面的代码:

 
  1. #include <QtGui> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     QApplication app(argc, argv); 
  5.  
  6.     QWidget segmentedButton; 
  7.     QToolButton *backButton = new QToolButton(&segmentedButton); 
  8.     QToolButton *forwardButton = new QToolButton(&segmentedButton); 
  9.     segmentedButton.setLayout(new QHBoxLayout); 
  10.     segmentedButton.layout()->setSpacing(0); 
  11.     segmentedButton.layout()->setMargin(0); 
  12.     backButton->setStyleSheet(QString("QToolButton{border-image:url(:/btn_left.png)}" 
  13.                                       "QToolButton:pressed{border-image:url(:/btn_left_pressed.png)}")); 
  14.     forwardButton->setStyleSheet(QString("QToolButton{border-image:url(:/btn_right.png)}" 
  15.                                       "QToolButton:pressed{border-image:url(:/btn_right_pressed.png)}")); 
  16.     backButton->setFixedSize(28, 23); 
  17.     forwardButton->setFixedSize(28, 23); 
  18.     segmentedButton.layout()->addWidget(backButton); 
  19.     segmentedButton.layout()->addWidget(forwardButton); 
  20.  
  21.     QWidget win; 
  22.     win.setLayout(new QHBoxLayout); 
  23.     win.layout()->setSpacing(0); 
  24.     win.layout()->setMargin(0); 
  25.     win.layout()->setAlignment(Qt::AlignLeft); 
  26.     win.layout()->addWidget(&segmentedButton); 
  27.     win.show(); 
  28.  
  29.     return app.exec(); 

即可得到上图所示的效果。注意,我们之所以把 segmentedButton 又放入一个新的 widget 里面,是由于 Windows 平台下的窗口有一个最小值。如果直接调用 segmenedButton.show(); ,由于这个最小值的缘故,两个 button 并不会在一起。使用这一技术,我们很容易制作出很漂亮的界面。这一技术的关键就在于图片素材的制作,将界面大部分工作交予美工。


本文转自 FinderCheng 51CTO博客,原文链接: 

http://blog.51cto.com/devbean/487888


相关文章
|
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天前
|
C++
基于Qt的简易桌面日历设计与实现
基于Qt的简易桌面日历设计与实现
33 1
|
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++应用程序开发框架
44 3
|
1天前
|
数据可视化
实现Hello Qt 程序
实现Hello Qt 程序
|
1天前
Qt程序打包发布记录使用windeployqt工具
Qt程序打包发布记录使用windeployqt工具
|
1天前
|
数据可视化
【Qt】—— Hello World程序的实现
【Qt】—— Hello World程序的实现