Acerca del pozo fácil de setStyleSheet () en la cobertura de estilo Qt

Descripción del problema

En Qt, muchas veces necesitamos usar hojas de estilo para establecer estilos de control, como colores, bordes y fuentes. Sin embargo, a veces el estilo establecido no tiene efecto o se establecen varios estilos pero solo se muestra uno.

Caso

He personalizado una QLabelclase de la MyLabelque heredé y espero que cuando cree su objeto, el control muestre un fondo verde y un texto rojo de forma predeterminada. el código se muestra a continuación:

  • 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();
}

Análisis de resultados

El efecto de ejecución es el siguiente: Se
Inserte la descripción de la imagen aquí
encuentra que solo el texto se muestra en rojo, ¡pero el fondo no ha cambiado! ***

Intenté invertir el orden de la declaración de dos líneas para establecer el estilo y modificar el código de la siguiente manera:

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

El efecto de ejecución es el siguiente: Se
Inserte la descripción de la imagen aquí
observa que después de configurar cada estilo, solo se muestra el estilo configurado la última vez y los demás se bloquean.

Después de pensarlo, debería ser que setStyleSheet () sobrescribirá la hoja de estilo anterior cada vez que se establezca el estilo, lo que dará como resultado que solo el último conjunto de estilos tenga efecto. Para confirmar esta inferencia, llamo al styleSheet()método para obtener la hoja de estilo final:

#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();
}

La información de impresión es la siguiente:

"background-color: green;"

Confirmada la conjetura.

Contramedida

Entonces, ¿cómo hacer que ambos estilos surtan efecto al mismo tiempo? Puede utilizar empalmes de cuerdas.

Ejemplo

  • 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();
}

Lo principal es cambiar el método de configuración de la cadena de la hoja de estilo para que reserve posiciones para diferentes estilos y las llene en secuencia al configurar.

El efecto de la operación es el siguiente:

Inserte la descripción de la imagen aquí

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

para resumir

SetStyleSheet () de Qt es en realidad una cadena para configurar la hoja de estilo, que se sobrescribirá, y su sintaxis es similar a css.

Solo puede haber una cadena de hoja de estilo, pero puede contener muchos tipos de estilos. Para mostrar varios estilos al mismo tiempo, solo una cadena de hoja de estilo contiene varios estilos.

Supongo que te gusta

Origin blog.csdn.net/gkzscs/article/details/100072832
Recomendado
Clasificación