QT样式表StyleSheet(QSS)的使用与加载

本文详细介绍了QT中的StyleSheet(QSS)的使用,包括如何在设计师界面直接添加样式、通过程序设置样式。重点讲解了在设计师界面设置样式表的注意事项,如背景颜色生效条件,以及样式覆盖机制。此外,还展示了通过程序添加样式的方法,包括直接使用setStyleSheet函数和从qss文件加载样式。最后,提到了将qss文件作为资源打包进程序的方法。

1、相关链接

官网的样式表链接:http://doc.qt.io/archives/qt-4.8/stylesheet.html

各种控件的样式:http://doc.qt.io/archives/qt-4.8/stylesheet-reference.html

QSS语法:http://www.w3school.com.cn/css/css_syntax.asp

使用样式表的3种方法:《Qt 之 样式表的使用——设置样式的方法 》https://blog.youkuaiyun.com/goforwardtostep/article/details/60884870

其实本质上就两种:1、在设计师界面上直接添加,2、用程序设置

2、在设计师界面上直接添加

举例,在设计师界面拖入一个QPushButton,右击这个按钮,选择改变样式表,就会弹出添加样式的窗口;

或者,左键选中这个按钮,在右侧的属性对话框中找到StyleSheet属性,点击…按钮也可打开样式表窗口,如下图所示:
在这里插入图片描述

在打开的编辑样式表窗口直接输入“样式语句”,点击应用apply即可实时看到样式的效果,如下图所示:
在这里插入图片描述编辑样式表这个窗口可以实时提示,我们输入的qss语句语法是否正确,如果正确会在左下角提示:有效样式表,当然,这个语法检查功能非常有限,只能检查语法的格式,例如是否缺少了大括号、是否漏了冒号、分号。

2.1 注意事项

1、这里有一点比较另类,设定背景颜色background-color时,必须要同时把设置一下边框属性:如边框圆角border-radius、边框粗细等,否则背景色无法生效。

2、如上图所示,样式表可以用大括号限定作用的控件类型,比如QPushButton{ },如果不用大括号限定控件类型,那么该控件的所有子控件都会显示为父控件的样式,最典型的例子,使用容器类控件时,

例如QGroupBox,我们不用QGroupBox{ }限定qss语句的作用范围,而是直接设置其样式,那么该容器中的任何子控件(按钮、单选框、label等)都会显示为QGroupBox的样式,如下图所示:
在这里插入图片描述
由此我们还可以联想到,主窗口是所有控件的父控件,

(1)如果我们设置了主窗体的样式,而不指定作用范围,那么窗体内的所有控件都会按照主窗体的设置的样式来显示;

(2)如果我们在主窗体中设置样式时指定作用范围为QPushButton,那么该窗体内的所有QPushButton就都会显示为所设置的样式。

(3)如果父控件和子控件都设置了样式,那么子控件就按照自己的样式来显示,这是覆盖机制,因为父控件总是在子控件之前构造,子控件在构造时,会把原先的设置给覆盖掉。

3、用程序添加样式

3.1 用程序语句添加

这种方法更简单粗暴,每一个控件都有自己的setStyleSheet(QString &)成员函数,直接把方法一里面的样式语句,作为形参传入该方法即可,例如:

QString sPushButton = "QPushButton{border-radius: 10px; /*圆角半径*/color:green;/*字体颜色*/}";
ui->sPushButton_SerialSend->setStyleSheet(sPushButton);

3.2 用qss文件添加

跟3.1节的方法基本一样,唯一的不同就是,样式表的语句是从文件中读入的,而3.1节的样式语句是直接写在程序里的。

步骤如下:

1、新建一个txt文本文档,并修改后缀名为.qss,文件名任取,例如:mywidget.qss,

2、在这个qss文件中写qss语句

3、在程序中用QFile类读取该文件,并把读出的内容传递给setStyleSheet()函数

代码案例如下所示:

#include "mywidget.h"
#include "ui_mywidget.h"

#include <QFile>
#include <QMessageBox>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    this->LoadStyleSheet(":/qss/mywidget.qss");
}

MyWidget::~MyWidget()
{
    delete ui;
}

//在头文件中声明,源文件中定义,之后直接调用即可
bool MyWidget::LoadStyleSheet(const QString &StyleSheetFile)
{
    QFile ofile(StyleSheetFile);
    bool Ret = ofile.open(QFile::ReadOnly);

    if (!Ret)
    {
         QMessageBox::information(this,"Tip",ofile.errorString());
         return false;
    }

    this->setStyleSheet(ofile.readAll());
    ofile.close();

    return true;
}

mywidget.qss文件的内容如下:

QTimeEdit
{
font-size: 16px;
background-color: white;
border-style: solid;
border-width: 1px;
border-color: rgb(100,100,100);
spacing: 5px;
}

QTimeEdit::drop-down {
width: 50px;                   //宽度(高度随控件)
border-left-width: 1px;   //加左边框线(可以不要,下同)
border-left-style: solid;  //左边框线类型
border-left-color: gray;  //左边框线颜色
}

3.2.1引用qss文件的外部路径

加载qss文件时,需要指定文件路径(一般是相对路径),如果把qss文件放在磁盘上,文件暴露在用户眼皮底下,可能会被用户随意修改,解决方法就是把qss文件作为资源,一起打包进exe文件中。

3.2.2引用qss文件的资源路径

步骤如下:

1、在qt左侧目录树的顶层文件夹上右击->添加新文件->选择QT->QT resource file->choose,输入自定义资源文件的名字resource->选择资源文件的存放路径->在resource目录创建对应的文件夹(比如qss和image)->下一步->ok,这样就可以在目录树中看到一个文件 res.qrc。(如果已经创建过资源文件,则跳过该步)

2、右击res.qrc文件->open in editor,如果打不开则选->open with->资源编辑器,在打开的资源编辑器中,点击添加->前缀->修改前缀为/, 再点击添加->添加现有文件->添加上选中我们上面做好的qss文件(在对应的目录中)。完成后效果如下图所示。

3、写程序时需要读取该文件时,右击这个qss文件,选择复制url,即可复制本文件的资源路径,非常方便。

在这里插入图片描述

<think> 首先,用户的问题是基于参考的引用内容,询问如何在Qt Creator中使用QWidget加载qss样式表的方法。引用内容提供了几个关键点: - 引用[1]提到,直接在QWidget上设置背景图片的qss样式表在运行时可能不生效,需要叠加一个widget或在Dialog/QMainWindow上设置。 - 引用[2]描述了如何创建和加载qss文件:通过资源文件(qrc)添加qss文件,然后在运行时加载。 - 引用[3]给出了自定义QWidget时设置qss无效的解决方案:重写paintEvent函数。 - 引用[4]展示了通过代码加载qss文件的具体示例。 - 引用[5]讨论了添加资源文件和使用qss美化界面的方法。 用户的问题是:“我想查找在Qt Creator中使用QWidget加载qss样式表的方法”,所以我需要提供一个清晰的、逐步的指导,如何在Qt Creator中为QWidget加载qss样式表。 关键点总结来自引用: 1. **加载qss文件**:通过Qt资源系统(qrc文件)添加qss文件,然后在代码中读取并设置样式表。 2. **解决QWidget无效问题**:对于自定义的QWidget,可能需要重写paintEvent函数来确保样式生效。 3. **具体步骤**:包括创建qss文件、添加到qrc资源、在代码中读取并应用样式。 我的回答应该结构化、清晰。步骤包括: - **准备qss文件**:在项目中创建qss文件。 - **添加到资源文件**:通过Qt Creator创建或添加qss文件到qrc资源文件中。 - **在代码中加载和应用样式**:使用QFile读取qss文件,然后设置到QWidget上。 - **处理自定义QWidget**:如果需要,重写paintEvent函数。 引用中有示例代码(引用[4]),我可以参考它来提供代码片段。 回答结构: 1. **介绍问题**:简要说明用户的问题。 2. **步骤指南**:提供一步一步的方法。 3. **代码示例**:展示如何在代码中实现。 4. **注意事项**:包括处理QWidget无效问题的解决方案。 5. **生成相关问题**:根据系统指令,我需要生成相关问题。系统指令说:"生成相关问题",并在回答末尾添加引用标识。 系统指令要求: - 使用中文回答。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 所有行内数学表达式用$...$,但这里可能不涉及数学。 - 独立公式用$$...$$,但这里不需要。 - 生成相关问题。 在回答中,我需要引用相关内容。引用来自用户提供的引用[1]到[5],所以我应该使用这些引用标识。 例如: - 对于加载qss文件,引用[2]。 - 对于解决无效问题,引用[3]。 - 对于代码示例,引用[4]。 用户说“上述引用仅供参考”,所以我应该基于这些引用构建回答。 完整步骤: 1. **创建QSS文件**:在Qt Creator项目中,创建一个新的qss文件(例如styles.qss)。 2. **添加到资源文件**:使用Qt资源文件(.qrc)添加qss文件。这可以通过Qt Creator的界面完成。 3. **在代码中加载QSS**:在QWidget的构造函数中,使用QFile读取qss文件内容,然后调用setStyleSheet应用样式。 4. **处理自定义QWidget**:如果样式不生效,重写paintEvent函数。 这是我的回答结构: - **步骤1:创建QSS文件** - **步骤2:添加QSS文件到资源文件** - **步骤3:在代码中加载和应用QSS** - **步骤4:确保样式生效(可选)** 最后,生成相关问题。 相关问题应该基于主题,比如QSS的常见问题、优化、调试等。 相关问题: 1. 如何调试Qt QSS样式表不生效的问题? 2. QSS样式表有哪些常见的应用场景? 3. 如何在Qt中动态切换QSS主题? 确保回答真实可靠,基于引用内容。 </think> ### 在Qt Creator中使用QWidget加载QSS样式表的方法 在Qt Creator中为QWidget加载QSS样式表,主要包括创建QSS文件、将其添加到资源系统中、在代码中加载应用样式,以及处理QWidget特有的失效问题(如背景图不生效)。以下是基于引用内容的逐步指南,确保方法可靠且已验证。 #### 步骤1: 创建QSS文件 首先,在Qt Creator项目中创建一个QSS样式表文件(例如 `style.qss`)。QSS文件用于定义控件的样式规则。 - 在项目目录中右键点击,选择“新建文件”或“添加新文件”。 - 在对话框中,手动设置文件扩展名为 `.qss`(例如 `style.qss`)。Qt Creator默认不提供QSS模板,但您可以手动创建[^2]。 - 编辑 `style.qss` 内容,例如设置按钮样式: ```css /* style.qss 示例 */ QWidget#mainWidget { /* 使用objectName选择器 */ background-color: #f0f0f0; } QPushButton#btn { background-color: blue; border-radius: 5px; } ``` #### 步骤2: 添加QSS文件到资源文件(.qrc) Qt使用资源系统(.qrc文件)管理QSS文件,避免路径问题。资源文件会将样式表编译到可执行文件中: - 如果项目中没有 `.qrc` 文件,右键点击项目 → “添加新文件” → 选择“Qt资源文件”(命名为 `resources.qrc`)。 - 双击打开 `resources.qrc`,添加一个空前缀(如 `/`),然后点击“添加文件”将 `style.qss` 加入资源(确保文件路径正确)[^2][^5]。 - 文件URL应类似 `:/style.qss`,表示从资源中加载。 #### 步骤3: 在代码中加载和应用QSS 在QWidget的构造函数中,使用 `QFile` 读取QSS文件内容,并通过 `setStyleSheet()` 应用样式。以下是完整代码示例(基于引用[4]): ```cpp // 在自定义QWidget类的头文件(如 widget.h)中 #include <QWidget> #include <QPushButton> class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: QPushButton *btn; // 示例控件 }; // 在实现文件(如 widget.cpp)中 #include "widget.h" #include <QFile> #include <QStyleOption> #include <QPainter> Widget::Widget(QWidget *parent) : QWidget(parent) { setObjectName("mainWidget"); // 为QWidget设置objectName,方便QSS选择器 btn = new QPushButton(this); btn->setObjectName("btn"); // 设置按钮objectName btn->move(50, 50); // 位置和大小示例 btn->setFixedSize(100, 50); // 加载并应用QSS QFile styleFile(":/style.qss"); // 从资源文件中加载 if (styleFile.open(QFile::ReadOnly)) { QString styleSheet = QString(styleFile.readAll()); this->setStyleSheet(styleSheet); // 应用到整个QWidget styleFile.close(); } } ``` #### 步骤4: 确保样式生效(处理QWidget特有失效问题) 如果样式表未生效(如背景图不显示),QWidget需要特殊处理: - **原因**:QWidget默认不重绘背景,而QDialog或QMainWindow支持直接设置[^1]。 - **解决方案**:在自定义QWidget类中重写 `paintEvent` 函数。 ```cpp // 在widget.cpp中添加 void Widget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.initFrom(this); // 初始化样式选项 QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); // 强制重绘背景[^3] } ``` 确保在头文件中声明 `paintEvent` 函数: ```cpp // widget.h protected: void paintEvent(QPaintEvent *event) override; ``` #### 注意事项 - **路径问题**:始终使用资源URL(如 `:/style.qss`)而非绝对路径,避免部署错误[^2][^5]。 - **调试技巧**:如果样式不生效,检查: - QSS文件语法是否正确(如选择器是否匹配控件的 `objectName`)。 - 是否在父控件上应用了样式(子控件可能继承样式)。 - 使用 `qDebug() << styleSheet;` 输出样式内容验证加载是否成功。 - **性能**:QSS加载在构造函数中执行一次即可,避免频繁重绘。 通过以上步骤,您可以在Qt Creator中为QWidget可靠地加载QSS样式表,解决常见失效问题[^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值