84 QDomElement colorElem = doc.createElement(
"colorData"_L1);
86 colorElem.setAttribute(
"r"_L1, QString::number(color.red()));
87 colorElem.setAttribute(
"g"_L1, QString::number(color.green()));
88 colorElem.setAttribute(
"b"_L1, QString::number(color.blue()));
89 colorElem.setAttribute(
"a"_L1, QString::number(color.alpha()));
108 QDomElement gradElem = doc.createElement(
"gradientData"_L1);
110 const QGradient::Type type = gradient.type();
111 gradElem.setAttribute(
"type"_L1, gradientTypeToString(type));
112 gradElem.setAttribute(
"spread"_L1, gradientSpreadToString(gradient.spread()));
113 gradElem.setAttribute(
"coordinateMode"_L1, gradientCoordinateModeToString(gradient.coordinateMode()));
115 const QGradientStops stops = gradient.stops();
116 for (
const QGradientStop &stop : stops)
117 gradElem.appendChild(saveGradientStop(doc, stop));
119 if (type == QGradient::LinearGradient) {
120 const QLinearGradient &g = *
static_cast<
const QLinearGradient *>(&gradient);
121 gradElem.setAttribute(
"startX"_L1, QString::number(g.start().x()));
122 gradElem.setAttribute(
"startY"_L1, QString::number(g.start().y()));
123 gradElem.setAttribute(
"endX"_L1, QString::number(g.finalStop().x()));
124 gradElem.setAttribute(
"endY"_L1, QString::number(g.finalStop().y()));
125 }
else if (type == QGradient::RadialGradient) {
126 const QRadialGradient &g = *
static_cast<
const QRadialGradient *>(&gradient);
127 gradElem.setAttribute(
"centerX"_L1, QString::number(g.center().x()));
128 gradElem.setAttribute(
"centerY"_L1, QString::number(g.center().y()));
129 gradElem.setAttribute(
"focalX"_L1, QString::number(g.focalPoint().x()));
130 gradElem.setAttribute(
"focalY"_L1, QString::number(g.focalPoint().y()));
131 gradElem.setAttribute(
"radius"_L1, QString::number(g.radius()));
132 }
else if (type == QGradient::ConicalGradient) {
133 const QConicalGradient &g = *
static_cast<
const QConicalGradient*>(&gradient);
134 gradElem.setAttribute(
"centerX"_L1, QString::number(g.center().x()));
135 gradElem.setAttribute(
"centerY"_L1, QString::number(g.center().y()));
136 gradElem.setAttribute(
"angle"_L1, QString::number(g.angle()));
164 if (elem.tagName() !=
"gradientData"_L1)
165 return QLinearGradient();
167 const QGradient::Type type = stringToGradientType(elem.attribute(
"type"_L1));
168 const QGradient::Spread spread = stringToGradientSpread(elem.attribute(
"spread"_L1));
169 const QGradient::CoordinateMode mode = stringToGradientCoordinateMode(elem.attribute(
"coordinateMode"_L1));
171 QGradient gradient = QLinearGradient();
173 if (type == QGradient::LinearGradient) {
175 g.setStart(elem.attribute(
"startX"_L1).toDouble(), elem.attribute(
"startY"_L1).toDouble());
176 g.setFinalStop(elem.attribute(
"endX"_L1).toDouble(), elem.attribute(
"endY"_L1).toDouble());
178 }
else if (type == QGradient::RadialGradient) {
180 g.setCenter(elem.attribute(
"centerX"_L1).toDouble(), elem.attribute(
"centerY"_L1).toDouble());
181 g.setFocalPoint(elem.attribute(
"focalX"_L1).toDouble(), elem.attribute(
"focalY"_L1).toDouble());
182 g.setRadius(elem.attribute(
"radius"_L1).toDouble());
184 }
else if (type == QGradient::ConicalGradient) {
186 g.setCenter(elem.attribute(
"centerX"_L1).toDouble(), elem.attribute(
"centerY"_L1).toDouble());
187 g.setAngle(elem.attribute(
"angle"_L1).toDouble());
191 QDomElement stopElem = elem.firstChildElement();
192 while (!stopElem.isNull()) {
193 QGradientStop stop = loadGradientStop(stopElem);
195 gradient.setColorAt(stop.first, stop.second);
197 stopElem = stopElem.nextSiblingElement();
200 gradient.setSpread(spread);
201 gradient.setCoordinateMode(mode);
210 QDomElement rootElem = doc.createElement(
"gradients"_L1);
212 QMap<QString, QGradient> grads = manager->gradients();
213 for (
auto itGrad = grads.cbegin(), end = grads.cend(); itGrad != end; ++itGrad) {
214 QDomElement idElem = doc.createElement(
"gradient"_L1);
215 idElem.setAttribute(
"name"_L1, itGrad.key());
216 QDomElement gradElem = saveGradient(doc, itGrad.value());
217 idElem.appendChild(gradElem);
219 rootElem.appendChild(idElem);
222 doc.appendChild(rootElem);
224 return doc.toString();
232 doc.setContent(state);
234 QDomElement rootElem = doc.documentElement();
236 QDomElement gradElem = rootElem.firstChildElement();
237 while (!gradElem.isNull()) {
238 const QString name = gradElem.attribute(
"name"_L1);
239 const QGradient gradient = loadGradient(gradElem.firstChildElement());
241 manager->addGradient(name, gradient);
242 gradElem = gradElem.nextSiblingElement();
247 bool checkeredBackground)
249 QImage image(size, QImage::Format_ARGB32);
251 p.setCompositionMode(QPainter::CompositionMode_Source);
253 if (checkeredBackground) {
255 QPixmap pm(2 * pixSize, 2 * pixSize);
258 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
259 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
260 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
261 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
263 p.setBrushOrigin((size.width() % pixSize + pixSize) / 2, (size.height() % pixSize + pixSize) / 2);
264 p.fillRect(0, 0, size.width(), size.height(), pm);
265 p.setBrushOrigin(0, 0);
266 p.setCompositionMode(QPainter::CompositionMode_SourceOver);
269 const qreal scaleFactor = 0.999999;
270 p.scale(scaleFactor, scaleFactor);
271 QGradient grad = gradient;
272 grad.setCoordinateMode(QGradient::StretchToDeviceMode);
273 p.fillRect(QRect(0, 0, size.width(), size.height()), grad);
274 p.drawRect(QRect(0, 0, size.width() - 1, size.height() - 1));
276 return QPixmap::fromImage(image);
305 if (gradient.type() != QGradient::ConicalGradient) {
307 switch (gradient.spread()) {
308 case QGradient::PadSpread:
311 case QGradient::ReflectSpread:
312 spread =
"reflect"_L1;
314 case QGradient::RepeatSpread:
315 spread =
"repeat"_L1;
318 qWarning() <<
"QtGradientUtils::styleSheetParameters(): gradient spread" << gradient.spread() <<
"not supported!";
321 result <<
"spread:"_L1 + spread;
324 switch (gradient.type()) {
325 case QGradient::LinearGradient: {
326 const QLinearGradient *linearGradient =
static_cast<
const QLinearGradient*>(&gradient);
327 result <<
"x1:"_L1 + QString::number(linearGradient->start().x())
328 <<
"y1:"_L1 + QString::number(linearGradient->start().y())
329 <<
"x2:"_L1 + QString::number(linearGradient->finalStop().x())
330 <<
"y2:"_L1 + QString::number(linearGradient->finalStop().y());
333 case QGradient::RadialGradient: {
334 const QRadialGradient *radialGradient =
static_cast<
const QRadialGradient*>(&gradient);
335 result <<
"cx:"_L1 + QString::number(radialGradient->center().x())
336 <<
"cy:"_L1 + QString::number(radialGradient->center().y())
337 <<
"radius:"_L1 + QString::number(radialGradient->radius())
338 <<
"fx:"_L1 + QString::number(radialGradient->focalPoint().x())
339 <<
"fy:"_L1 + QString::number(radialGradient->focalPoint().y());
342 case QGradient::ConicalGradient: {
343 const QConicalGradient *conicalGradient =
static_cast<
const QConicalGradient*>(&gradient);
344 result <<
"cx:"_L1 + QString::number(conicalGradient->center().x())
345 <<
"cy:"_L1 + QString::number(conicalGradient->center().y())
346 <<
"angle:"_L1 + QString::number(conicalGradient->angle());
350 qWarning() <<
"QtGradientUtils::styleSheetParameters(): gradient type" << gradient.type() <<
"not supported!";
360 const QGradientStops &stops = gradient.stops();
361 for (
const QGradientStop &stop : stops) {
362 const QColor color = stop.second;
364 const QString stopDescription =
"stop:"_L1 + QString::number(stop.first) +
" rgba("_L1
365 + QString::number(color.red()) +
", "_L1
366 + QString::number(color.green()) +
", "_L1
367 + QString::number(color.blue()) +
", "_L1
368 + QString::number(color.alpha()) + QLatin1Char(
')');
369 result << stopDescription;