关于Qt中setStyleSheet()易踩的坑——样式覆盖

9 篇文章 7 订阅
8 篇文章 1 订阅

问题描述

在Qt中,很多时候我们都需要使用样式表来设置控件样式,如颜色、边框、字体等。然而,有时候设置的样式却没有生效,或者设置多个样式却只展现出一个。

案例

我自定义了一个继承于QLabel的类MyLabel,并希望创建其对象时,控件就默认显示绿色背景及红色文字。代码如下:

  • MyLabel.h
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT

public:
    explicit MyLabel(QWidget *parent = nullptr);

private:
    void setBgColor();
    void setFontColor();
};

#endif // MYLABEL_H
  • MyLabel.cpp
#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    setBgColor();
    setFontColor();
}

void MyLabel::setBgColor()
{
    setStyleSheet("background-color: green;");
}

void MyLabel::setFontColor()
{
    setStyleSheet("color: red");
}
  • main.cpp
#include "mylabel.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyLabel *label = new MyLabel;
    label->setText("Hello, CS");
    label->resize(200, 200);
    label->show();

    return a.exec();
}

结果分析

运行效果如下:
在这里插入图片描述
发现***仅文字显示为了红色,但背景没有变化!***

我尝试调换了设置样式的两行语句的顺序,修改代码如下:

  • MyLabel.cpp
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    setFontColor();
    setBgColor();
}

运行效果如下:
在这里插入图片描述
观察发现,每次设置样式后,均只显示了最后一次设置的样式,其他的被屏蔽!

经思考,应该是setStyleSheet()每次设置样式都会覆盖之前的样式表,导致只有最后设置的样式生效。为确认此推断,我调用styleSheet()方法获取最终的样式表:

#include "mylabel.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyLabel *label = new MyLabel;
    label->setText("Hello, CS");
    label->resize(200, 200);
    qDebug() << label->styleSheet();
    label->show();

    return a.exec();
}

打印信息如下:

"background-color: green;"

证实了猜想。

对策

那么该如何同时让两种样式均生效呢?可使用字符串拼接的方式。

Example

  • MyLabel.h
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT

public:
    explicit MyLabel(QWidget *parent = nullptr);

private:
    void setBgColor();
    void setFontColor();

private:
    QString _styleSheet;
    QString _bgColor;
    QString _fontColor;
};

#endif // MYLABEL_H
  • MyLabel.cpp
#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    setFontColor();
    setBgColor();
}

void MyLabel::setBgColor()
{
    _bgColor = "green";
    _styleSheet = "background-color: %1; color: %2;";
    _styleSheet = _styleSheet.arg(_bgColor).arg(_fontColor);
    setStyleSheet(_styleSheet);
}

void MyLabel::setFontColor()
{
    _fontColor = "red";
    _styleSheet = "background-color: %1; color: %2;";
    _styleSheet = _styleSheet.arg(_bgColor).arg(_fontColor);
    setStyleSheet(_styleSheet);
}
  • main.cpp
#include "mylabel.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyLabel *label = new MyLabel;
    label->setText("Hello, CS");
    label->resize(200, 200);
    qDebug() << label->styleSheet();
    label->show();

    return a.exec();
}

主要就是改变了样式表字符串的设置方式,让它预留不同样式的位置,设置时依次填充即可。

运行效果如下:

在这里插入图片描述

"background-color: green; color: red;"

总结

Qt的setStyleSheet()实际就是设置样式表的字符串,会覆盖,其语法与css类似。

样式表字符串只能有一个,但其中所包含的样式种类可以有很多。要同时显示多种样式,只需要让一个样式表字符串包含多种样式即可。

  • 18
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在Qt,可以使用setStyleSheet方法为窗口或部件设置样式表。setStyleSheet方法接受一个QString类型的参数,该参数包含CSS样式表的规则。 以下是使用setStyleSheet方法设置样式表的示例代码: ```cpp // 创建一个QPushButton QPushButton *button = new QPushButton("Click me!", this); // 设置样式表 button->setStyleSheet("QPushButton {" "background-color: blue;" "color: white;" "border-style: outset;" "border-width: 2px;" "border-radius: 10px;" "border-color: beige;" "font: bold 14px;" "min-width: 10em;" "padding: 6px;" "}"); // 将按钮添加到窗口 button->show(); ``` 在上面的示例代码,我们创建了一个QPushButton并使用setStyleSheet方法设置了一个样式表。样式表定义了按钮的背景颜色、文本颜色、边框样式、边框宽度、边框半径、边框颜色、字体、最小宽度和内边距。 ### 回答2: QtsetStyleSheet()是一种强大的方法,它可以帮助用户在Qt应用程序实现自定义的样式效果。 该方法允许用户通过使用CSS语言来设置各种控件的样式。此外,它可以帮助用户更快地进行界面开发,使得设计师能够更快地实现自己的设计想法。 setStyleSheet()方法可以以字符串形式接受CSS样式表,并将其应用于给定的小部件、控件或整个应用程序的所有小部件。它可以让用户自定义控件的背景颜色、字体、边框等,从而创造出独特的UI外观。 使用styleSheet可以使用简单的选择器,甚至可以使用复杂的选择符来针对特定情况提供特定的样式。例如,您可以为按钮设置鼠标悬停时的样式,并使用“:hover”伪类规则实现这一目的。 setStyleSheet()还允许用户使用QPalette类来设置应用程序使用的颜色,并仅在设置背景、文本和其他颜色时使用该类。这样,每个颜色都可以由设计师定制,而不必在代码逐个设置。 总之,setStyleSheet()方法在Qt应用程序的界面开发极其有用,可以使用户更快地实现自己的想法,从而增强了开发人员的生产率和用户的体验。 ### 回答3: Qt是一个非常流行的跨平台应用程序开发框架,提供了非常丰富的GUI组件。Qt允许用户通过其强大的setStyleSheet函数来改变组件的外观。这个函数允许用户使用CSS样式描述来设置组件的外观。这个函数的使用非常简单,只需要将样式描述作为参数传递给函数即可。 使用setStyleSheet函数可以自定义各种不同的组件属性,包括背景颜色、字体颜色、边框宽度、圆角大小等等。使用这个函数的一个好处是,如果需要修改组件的外观,只需要修改一次样式描述即可,而不用修改每个组件的属性。 为了使用setStyleSheet函数,必须熟悉CSS样式描述的基本语法。CSS样式描述使用类似于HTML的语法,但是它包含了一些额外的属性,如背景图片和渐变颜色等。 例如,以下代码将QPushButton的背景颜色设置为红色,边框宽度为1像素,字体颜色为白色: ``` QPushButton { background-color: red; border: 1px solid black; color: white; } ``` 需要注意的是,在使用setStyleSheet函数时,只需要为组件设置自定义样式描述,不需要为每个组件创建一个独立的样式表。 总之,setStyleSheet函数是Qt GUI编程非常重要的函数之一。我们可以使用它来美化组件的外观,并快速实现视觉效果。学好setStyleSheet函数,可以让我们的Qt应用程序更加美观和舒适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值