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 QLabel
clase de la MyLabel
que 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
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
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:
"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.