16-3_Qt 5.9 C++开发指南_使用QStyle 设置界面外观_实现不同系统下的界面效果的匹配

文章目录

  • 1. QStyle的作用(实现不同系统下的界面效果的匹配)
  • 2. Qt内置样式的使用
  • 3. 源码
    • 3.1 可视化UI设计
    • 3.2 mainwindow.cpp

1. QStyle的作用(实现不同系统下的界面效果的匹配)

Qt 是一个跨平台的类库,相同的界面组件在不同的操作系统上显示效果是不一样的。QStyle是封装了 GUI 界面组件外观的抽象类,Qt 定义了 QStyle 类的一些子类,应用于不同的操作系统如QWindowsStyle和QMacStyle 等。这些样式是 QtGUI 模块自带的,在不同的平台上编译运行的程序具有缺省的样式,QApplication::style()可以返回应用程序缺省的样式
Qt 内置的界面组件都使用 QStyle 进行绘制,以保证它们与运行平台的界面效果一致,如图16-8 所示是OComboBox在不同操作系统上的九种不同的样式。

在这里插入图片描述

QStyleFactory 类管理着 Qt 的内置样式,QStyleFactory 有两个静态函数 keys()和 create(),其函数原型如下:

[static] QStringList QStyleFactory::keys()
[static] QStyle *QStyleFactory::create(const QString &key)

keys()函数返回一个字符串列表,是所在平台支持的 QStyle 的名称列表;create()函数根据样式名称字符串创建一个QStyle 对象。
QApplication 有两个静态函数用于操作样式,其函数原型为:

QStyle *QApplication::style()
void QApplication::setStyle(QStyle *style)

style()函数返回应用程序当前的样式,任何一个 GUI 应用程序,在创建时就有一个缺省的样式,通过下面的语句:

QApplication::style()->metaObject ()->className()

setStyle()为应用程序设置一个样式,设置样式后,界面元素都具有这个样式所定义的外观。

除了这些 Qt 内置的样式,用户也可以从 QStyle 类继承,定义自己的样式,一般是从 QStyle的子类QProxyStyle 继承。

2. Qt内置样式的使用

使用 Qt内置的样式,可以通过 QStyleFactory:keys()获取运行平台支持的样式列表,然后用QStyleFactory::create()创建样式,再用 QApplication::setStyle0)设置样式即可。

创建一个基于QMainWindow 的 Widget 应用程序 samp16_2,并设计界面。如图 16-9 所示是设置为QWindowsStyle样式时的运行界面,具有老式的 Windows 界面效果。

在这里插入图片描述

下面是主窗口构造函数的代码:

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QRegExp regExp(".(.*)\\+?Style");QString defaultStyle = QApplication::style()->metaObject()->className();
//    ui->LabDefaultStyle->setText(defaultStyle);ui->statusBar->showMessage(defaultStyle);if (regExp.exactMatch(defaultStyle))defaultStyle = regExp.cap(1);ui->comboSysStyle->addItems(QStyleFactory::keys());ui->comboSysStyle->setCurrentIndex(ui->comboSysStyle->findText(defaultStyle, Qt::MatchContains));
//    ui->comboSysStyle->setCurrentIndex(ui.styleSheetCombo->findText("Coffee"));
//    loadStyleSheet("Coffee");
}

在构造函数中,通过QStyleFactory::keys()获取当前平台上的样式名称列表,并添加到下拉列表框comboSysStyle 里。
程序运行后,在“系统样式”下拉列表框里会显示当前平台支持的样式列表,例如在 Windows平台上,列表里会有 Widnows、WidnowsXP、WidnowsVista和 Fusion。在“系统样式”下拉列表框中选择一个样式可以为应用程序设置样式,下拉列表框comboSysStyle 的currentIndexChanged()信号响应槽函数代码如下:

void MainWindow::on_comboSysStyle_currentIndexChanged(const QString &arg1)
{
//    qApp->setStyle(arg1);QStyle *style=QStyleFactory::create(arg1);qApp->setStyle(style);ui->statusBar->showMessage(style->metaObject()->className());
}

这里首先使用 QStyleFactory::create(argl)根据选择的样式名称字符串 argl 创建样式 style,然后使用qApp->setStyle(style)为应用程序设置样式。

如果不是需要显示样式的类名称,直接使用qApp->setStyle(arg1)也可以为应用程序设置样式。

窗口上有“取消样式表”和“应用样式表”两个按钮,代码如下:

void MainWindow::on_btnNormal_clicked()
{//正常样式,去除所有样式表this->setStyleSheet("");
}void MainWindow::on_btnStyleSheet_clicked()
{//设置样式表this->setStyleSheet("QPlainTextEdit{""color: blue; ""font: 13pt '宋体';}""QPushButton:hover{background-color:lime;}""QLineEdit{ border: 2px groove red;""background-color: rgb(170, 255, 127); ""border-radius: 6px;}""QCheckBox:checked{color: red;}""QRadioButton:checked{color:red;}");}

“应用样式表”按钮的代码为界面上的几个显示组件类设置了样式表,在设置样式表后,即使修改窗口样式,这些样式表定义的显示效果依然存在。

3. 源码

3.1 可视化UI设计

在这里插入图片描述

3.2 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include    <QStyleFactory>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QRegExp regExp(".(.*)\\+?Style");QString defaultStyle = QApplication::style()->metaObject()->className();
//    ui->LabDefaultStyle->setText(defaultStyle);ui->statusBar->showMessage(defaultStyle);if (regExp.exactMatch(defaultStyle))defaultStyle = regExp.cap(1);ui->comboSysStyle->addItems(QStyleFactory::keys());ui->comboSysStyle->setCurrentIndex(ui->comboSysStyle->findText(defaultStyle, Qt::MatchContains));
//    ui->comboSysStyle->setCurrentIndex(ui.styleSheetCombo->findText("Coffee"));
//    loadStyleSheet("Coffee");
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_comboSysStyle_currentIndexChanged(const QString &arg1)
{
//    qApp->setStyle(arg1);QStyle *style=QStyleFactory::create(arg1);qApp->setStyle(style);ui->statusBar->showMessage(style->metaObject()->className());
}void MainWindow::on_btnNormal_clicked()
{//正常样式,去除所有样式表this->setStyleSheet("");
}void MainWindow::on_btnFontLarge_clicked()
{//大字体ui->plainTextEdit->setStyleSheet("font: 13pt '宋体';");
}void MainWindow::on_btnFontSmall_clicked()
{//小字体ui->plainTextEdit->setStyleSheet("font: 10pt '宋体';");
}void MainWindow::on_btnStyleSheet_clicked()
{//设置样式表this->setStyleSheet("QPlainTextEdit{""color: blue; ""font: 13pt '宋体';}""QPushButton:hover{background-color:lime;}""QLineEdit{ border: 2px groove red;""background-color: rgb(170, 255, 127); ""border-radius: 6px;}""QCheckBox:checked{color: red;}""QRadioButton:checked{color:red;}");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/59625.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python版《羊了个羊》游戏开发第一天

Python小型项目实战教学课《羊了个羊》 一、项目开发大纲&#xff08;初级&#xff09; 版本1.0&#xff1a;基本开发 课次 内容 技术 第一天 基本游戏地图数据 面向过程 第二天 鼠标点击和移动 面向对象 第三天 消除 设计模式&#xff1a;单例模式 第四天 完整…

Database Comparer VCL for Delphi crack

Database Comparer VCL for Delphi crack 数据库比较器VCL比较并同步许多流行数据库的数据库结构(元数据)和表数据。支持的数据库列表不断更新&#xff0c;包括InterBase、FireBird、MySQL、MSSQL、Oracle、Sybase、PostgreSQL、DB2、PervasiveSQL、MSAccess、Paradox、DBASE以…

访问者模式——操作复杂对象结构

1、简介 1.1、概述 访问者模式是一种较为复杂的行为型设计模式&#xff0c;它包含访问者和被访问元素两个主要组成部分。这些被访问的元素通常具有不同的类型&#xff0c;且不同的访问者可以对它们进行不同的访问操作。访问者模式使得用户可以在不修改现有系统的情况下扩展系…

分布式搜索ElasticSearch-ES(一)

一、ElasticSearch介绍 ES是一款非常强大的开源搜索引擎&#xff0c;可以帮我们从海量的数据中快速找到我们需要的内容。 ElasticSearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack(ELK)&#xff0c;被广泛运用在日志数据分析&#xff0c;实时监控等领域。 …

Golang 包详解以及go mod

Golang 中包的介绍和定义 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言为我们提供了 很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。 Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包…

View绘制流程-Window创建

前言&#xff1a; View绘制流程中&#xff0c;主要流程是这样的&#xff1a; 1.用户进入页面&#xff0c;首先创建和绑定Window&#xff1b; 2.首次创建以及后续vsync信号来临时&#xff0c;会请求执行刷新流程&#xff1b; 3.刷新流程完成后&#xff0c;会通知SurfaceFlin…

【机器学习1】什么是机器学习机器学习的重要性

什么是机器学习? 简而言之&#xff0c;机器学习就是训练机器去学习。 机器学习作为人工智能(Artificial Intelligence,AI)的一个分支&#xff0c;以其最基本的形式来使用算法通过从数据中获取知识来进行预测。 不同于人类通过分析大量数据手动推导规则和模型&#xff0c;机…

等了10年,工信部的APP备案终于来了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 2005年3月&#xff0c;工信部要求所有境内网站都要进行网站备案、公安备案。 2023年8月&#xff0c;工信部要求所有的APP、小程序进行备案。否则…… 这绝对是一个移动互联网创业分水岭&#xff0…

Linux初识网络基础

目录 网络发展 认识“协议 ” 网络协议 OSI七层模型&#xff1a; TCP/IP五层&#xff08;或四层&#xff09;模型 网络传输基本流程 网络传输流程图&#xff1a; 数据包封装和封用 网络中的地址 认识IP地址&#xff1a; 认识MAC地址&#xff1a; 网络发展 1.独立…

计算机网络实验1:网络命令学习

文章目录 1. 主要教学内容2. ping命令2.1 发送ping测试报文2.2 检测TCP/IP 3. tracert命令4. ipconfig命令5. netstat命令6. arp命令7. net命令8. netsh命令 1. 主要教学内容 实验内容&#xff1a;学习ping、tracert、ipconfig等常用的网络命令。所需学时&#xff1a;1。重难点…

免费商用图片素材网站,4K高清无水印。

推荐6个图片素材网站&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;希望对大家有帮助。 菜鸟图库 美女图片|手机壁纸|风景图片大全|高清图片素材下载网 - 菜鸟图库 网站主要是为新手设计师提供免费素材的&#xff0c;素材的质量都很高&#xff0c;类别也很多&#x…

compile_and_runtime_not_namespaced_r_class_jar\debug\R.jar: 另一个程序正在使用

问题情况&#xff1a; run App的时候&#xff0c;提示该文件被占用 想要clean Project&#xff0c;还是提示该文件被占用&#xff0c;这个文件和连带的文件夹都无法被删除。 方法1&#xff1a; AndroidStudio下方的terminal&#xff08;没有这个窗口的话&#xff0c;从上面的…