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

2023-11-05

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;}"
                        );

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 强制 const 存储返回的值 value

    这就是我想要实现的目标 struct test const test returnconst return test test returnnonconst return test int main test t1 returnnoncon
  • 实体框架 - sql server 表中未设置默认值

    SQL Server 2005 数据库表有一列 createdon 其默认值设置为 getdate 我正在尝试使用实体框架添加记录 createdon 列未更新 我是否错过了实体框架中的任何属性 请提出建议 这是实体框架存在的少数问题之一
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 代码块调试问题

    我正在尝试在代码块中运行一个简单的链表程序 但我无法运行该程序并且收到以下错误 Active debugger config GDB CDB debugger Default Building to ensure sources are u
  • 在 std::forward 中它如何接受右值?

    看看斯科特 迈耶的有效的现代 C 第200 201页 建议的简化实施std forward可能是 在其他地方看到了正确的实现 template
  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • 类型定义存在于两个库中

    我正在使用 NET 4 5 构建 ASP NET Web 窗体网站 错误 The type System ComponentModel DataAnnotations Schema ForeignKeyAttribute exists in
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • 在 C++ 中从另一个数组初始化结构内的数组[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions struc
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • WPF 中可选择的 TextBlock 或带有格式化文本的 TextBox

    我遇到一种情况 我需要显示格式化文本 正常 粗体 突出显示 并且还应该是可选择的 以便用户可以复制文本 我使用了文本块 我可以使用内联内容流元素应用多种格式 但不幸的是它的文本不可选择 虽然文本框允许选择文本并复制到剪贴板 但它不允许我设置
  • 在 C# 中给定周数和年份,计算一周的开始和结束日期(基于 ISO 规范)

    我需要生成一份报告 显示一年中的 52 周 或某些年份的 53 周 及其开始日期和结束日期 有一个 ISO 规范可以做到这一点 但看起来非常复杂 我希望有人知道在 C 或 Visual Basic 中执行此操作的方法 实际上适用于 Visu
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 向量和常量

    考虑一下这个 void f vector
  • 等效

    这是否保证始终为真 std numeric limits
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • { Qt5.0.2/QML/QtQuick2.0/C++ } 运行没有错误的示例项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的设置是Qt5 0 2 MinGW 32位 我在寻找 Qt5 0 2 QML QtQuick2 0 C 代码项目示例 不是Qt Qu

随机推荐

  • CSS选择器(nth-child)

    nth child 这个选择符括号内可以写 an b a b均为整数 或者关键字 因为工作中有遇到要隐藏列表第三个子元素之后的所有子元素 所以有用到这个选择器 记录一下 1 nth child a 当括号里只写一个数字 比如 list li
  • OSI七层参考模型和数据封装

    OSI七层参考模型和数据封装 一 网络基础原理 1 分层思想 二 OSI七层参考模型 三 TCP IP协议簇和OSI参考模型 1 TCP IP五层模型常见协议 2 ARP是地址解析协议 3 RARP是反地址解析协议 四 PDU协议数据单元数
  • Flash概念简述

    1 Flash全名叫做Flash Memory Flash存储芯片的一种 通过特定的程序可以修改里面的数据 Flash属于非易失性存储设备 Non volatile Memory Device 与此相对应的是易失性存储设备 Volatile
  • RK3568 HDMI EDID处理过程

    一 简介 EDID是什么 EDID的全称是Extended Display Identification Data 扩展显示标识数据 VGA DVI的EDID由主块128字节组成 HDMI的EDID增加扩展块 128字节 扩展块的内容主要是
  • Jupyter notebook 如何设定默认的保存目录?

    前言 做智能车的时候 Jupter Notebook的默认保存在可怜的C盘 本来就很紧张的C肯定受不了 要改到别的地方 网上找了一些参考 说变更一下配置地址就可以了 照着做 99 的博客说 设置完了 关闭重启就好了 试了几次 根本不是关闭重
  • Proxmox VE 使用ACME 自动获取证书(DNSPOD)

    前言 PVE中自带了ACME 的支持 但是在国内对DNSPOD的支持似乎不是很好 所以只能采取手动的方式 一 使用步骤 以下步骤均在pve 的管理界面中 打开节点的shell 窗口中执行 安装ACME wget O acme1 sh htt
  • 页面访问量和网站访问量的统计

    网页点击计数器 以下是实现一个简单的基于 Servlet 生命周期的网页点击计数器需要采取的步骤 在 init 方法中初始化一个全局变量 每次调用 doGet 或 doPost 方法时 都增加全局变量 如果需要 您可以使用一个数据库表来存储
  • c++ 四元数转欧拉角

    c 四元数转欧拉角 两种方法 供你选择 方法 输入 x y z w 为四元数 输出 roll pitch yaw欧拉角 static void toEulerAngle const double x const double y const
  • FPGA驱动0.96oled显示屏 (4线 SPI) verilog语言

    之前也陆陆续续看了很多博客 也都能在自己的屏幕上显示出来 但是问题就是不知道怎么修改代码显示自己希望显示的东西 而且由于没注释原因看不太懂 最终的实现效果最终实现效果视频 b站视频链接1 评论区有人给了源码的百度网盘链接 csdn博客链接1
  • 1、若依服务网关

    文章目录 一 基础介绍 二 使用网关 1 添加依赖 2 resources application yml 配置文件 3 网关启动类 三 路由规则 1 Datetime 2 Cookie 3 Header 4 Host 5 Method 6
  • LeetCode Week 2

    LeetCode Week 2 保护好你的身体 和病痛比起来 其他的困难都不值一提 问题集合 1 Invert Binary Tree Easy 226 Invert a binary tree 4 2 7 1 3 6 9 to 4 7 2
  • Navicat远程连接MySQL服务器

    文章目录 一 准备 二 配置Navicat允许远程连接MySQL数据库 1 使用Navicat直接连接MySQL 2 使用 Navicat 通过 SSH 远程登录后再本地方式连接 MySQL 3 查看连接 为什么使用ssh登录 1 便捷性
  • AI工程师职业经验指南——转转推荐算法部负责人告诉你如何能够成为一名合格的机器学习算法工程师

    文章转载自 程序员杂志 2017 11 成为一名合格的开发工程师不是一件简单的事情 需要掌握从开发到调试到优化等一系列能力 这些能力中的每一项掌握起来都需要足够的努力和经验 而要成为一名合格的机器学习算法工程师 以下简称算法工程师 更是难上
  • 网络内安全试验场第三次CTF答题夺旗赛

    最近参加了网络内安全试验场第三次CTF答题夺旗赛 写wp 以后要做一个每次比赛完立马写wp的菜鸡 个人习惯 我做题一般喜欢从杂项 隐写开始 第一题 下载完成之后发现是个word 打开时需要密码 但是在题目中给提示了 所以直接输入密码 我以为
  • 自己手动搭建ssm框架实现增删改查、图片的上传、排序的移动所遇到问题的总结

    如图所示实现的增删改查 上移和下移 总结一下自己的不足之处 以前的公司都是自己有封装的框架而且有一段时间没做mvc了对此没有那么的熟悉 1 controller层返回的ModelAndView 后面希望能够改成String 然后再通过视图解
  • UTXO详解

    UTXO详解 https blog csdn net ztemt sw2 t 1 https blog csdn net yzpbright article details 82218759 比特币交易中的基础构建单元是交易输出 交易输出是
  • DBeaver连接clickhouse

    一 安装DBeaver 下载地址 Download DBeaver Community 1 选择自己电脑的安装包 2 安装完成之后 启动安装程序 3 选择语言及安装路径等 确认安装 4 安装成功 二 连接clickhouse 1 启动dbe
  • 一文带你梳理React面试题(2023年版本)

    前言 一 React18有哪些更新 setState自动批处理 在react17中 只有react事件会进行批处理 原生js事件 promise setTimeout setInterval不会 react18 将所有事件都进行批处理 即多
  • nginx 基础 域名、dns 、虚拟主机

    Nginx 基础应用实战 02 域名 dns与http协议 mashibing com server 相关配置 listen 80 监听端口 server name www mashibing com mashibing com 域名可以有
  • 16-3_Qt 5.9 C++开发指南_使用QStyle 设置界面外观_实现不同系统下的界面效果的匹配

    文章目录 1 QStyle的作用 实现不同系统下的界面效果的匹配 2 Qt内置样式的使用 3 源码 3 1 可视化UI设计 3 2 mainwindow cpp 1 QStyle的作用 实现不同系统下的界面效果的匹配 Qt 是一个跨平台的类