86 QDomElement colorElem = doc.createElement(
"colorData"_L1);
88 colorElem.setAttribute(
"r"_L1, QString::number(color.red()));
89 colorElem.setAttribute(
"g"_L1, QString::number(color.green()));
90 colorElem.setAttribute(
"b"_L1, QString::number(color.blue()));
91 colorElem.setAttribute(
"a"_L1, QString::number(color.alpha()));
110 QDomElement gradElem = doc.createElement(
"gradientData"_L1);
112 const QGradient::Type type = gradient.type();
113 gradElem.setAttribute(
"type"_L1, gradientTypeToString(type));
114 gradElem.setAttribute(
"spread"_L1, gradientSpreadToString(gradient.spread()));
115 gradElem.setAttribute(
"coordinateMode"_L1, gradientCoordinateModeToString(gradient.coordinateMode()));
117 const QGradientStops stops = gradient.stops();
118 for (
const QGradientStop &stop : stops)
119 gradElem.appendChild(saveGradientStop(doc, stop));
121 if (type == QGradient::LinearGradient) {
122 const QLinearGradient &g = *
static_cast<
const QLinearGradient *>(&gradient);
123 gradElem.setAttribute(
"startX"_L1, QString::number(g.start().x()));
124 gradElem.setAttribute(
"startY"_L1, QString::number(g.start().y()));
125 gradElem.setAttribute(
"endX"_L1, QString::number(g.finalStop().x()));
126 gradElem.setAttribute(
"endY"_L1, QString::number(g.finalStop().y()));
127 }
else if (type == QGradient::RadialGradient) {
128 const QRadialGradient &g = *
static_cast<
const QRadialGradient *>(&gradient);
129 gradElem.setAttribute(
"centerX"_L1, QString::number(g.center().x()));
130 gradElem.setAttribute(
"centerY"_L1, QString::number(g.center().y()));
131 gradElem.setAttribute(
"focalX"_L1, QString::number(g.focalPoint().x()));
132 gradElem.setAttribute(
"focalY"_L1, QString::number(g.focalPoint().y()));
133 gradElem.setAttribute(
"radius"_L1, QString::number(g.radius()));
134 }
else if (type == QGradient::ConicalGradient) {
135 const QConicalGradient &g = *
static_cast<
const QConicalGradient*>(&gradient);
136 gradElem.setAttribute(
"centerX"_L1, QString::number(g.center().x()));
137 gradElem.setAttribute(
"centerY"_L1, QString::number(g.center().y()));
138 gradElem.setAttribute(
"angle"_L1, QString::number(g.angle()));
166 if (elem.tagName() !=
"gradientData"_L1)
167 return QLinearGradient();
169 const QGradient::Type type = stringToGradientType(elem.attribute(
"type"_L1));
170 const QGradient::Spread spread = stringToGradientSpread(elem.attribute(
"spread"_L1));
171 const QGradient::CoordinateMode mode = stringToGradientCoordinateMode(elem.attribute(
"coordinateMode"_L1));
173 QGradient gradient = QLinearGradient();
175 if (type == QGradient::LinearGradient) {
177 g.setStart(elem.attribute(
"startX"_L1).toDouble(), elem.attribute(
"startY"_L1).toDouble());
178 g.setFinalStop(elem.attribute(
"endX"_L1).toDouble(), elem.attribute(
"endY"_L1).toDouble());
180 }
else if (type == QGradient::RadialGradient) {
182 g.setCenter(elem.attribute(
"centerX"_L1).toDouble(), elem.attribute(
"centerY"_L1).toDouble());
183 g.setFocalPoint(elem.attribute(
"focalX"_L1).toDouble(), elem.attribute(
"focalY"_L1).toDouble());
184 g.setRadius(elem.attribute(
"radius"_L1).toDouble());
186 }
else if (type == QGradient::ConicalGradient) {
188 g.setCenter(elem.attribute(
"centerX"_L1).toDouble(), elem.attribute(
"centerY"_L1).toDouble());
189 g.setAngle(elem.attribute(
"angle"_L1).toDouble());
193 QDomElement stopElem = elem.firstChildElement();
194 while (!stopElem.isNull()) {
195 QGradientStop stop = loadGradientStop(stopElem);
197 gradient.setColorAt(stop.first, stop.second);
199 stopElem = stopElem.nextSiblingElement();
202 gradient.setSpread(spread);
203 gradient.setCoordinateMode(mode);
212 QDomElement rootElem = doc.createElement(
"gradients"_L1);
214 QMap<QString, QGradient> grads = manager->gradients();
215 for (
auto itGrad = grads.cbegin(), end = grads.cend(); itGrad != end; ++itGrad) {
216 QDomElement idElem = doc.createElement(
"gradient"_L1);
217 idElem.setAttribute(
"name"_L1, itGrad.key());
218 QDomElement gradElem = saveGradient(doc, itGrad.value());
219 idElem.appendChild(gradElem);
221 rootElem.appendChild(idElem);
224 doc.appendChild(rootElem);
226 return doc.toString();
234 doc.setContent(state);
236 QDomElement rootElem = doc.documentElement();
238 QDomElement gradElem = rootElem.firstChildElement();
239 while (!gradElem.isNull()) {
240 const QString name = gradElem.attribute(
"name"_L1);
241 const QGradient gradient = loadGradient(gradElem.firstChildElement());
243 manager->addGradient(name, gradient);
244 gradElem = gradElem.nextSiblingElement();
249 bool checkeredBackground)
251 QImage image(size, QImage::Format_ARGB32);
253 p.setCompositionMode(QPainter::CompositionMode_Source);
255 if (checkeredBackground) {
257 QPixmap pm(2 * pixSize, 2 * pixSize);
260 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
261 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
262 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
263 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
265 p.setBrushOrigin((size.width() % pixSize + pixSize) / 2, (size.height() % pixSize + pixSize) / 2);
266 p.fillRect(0, 0, size.width(), size.height(), pm);
267 p.setBrushOrigin(0, 0);
268 p.setCompositionMode(QPainter::CompositionMode_SourceOver);
271 const qreal scaleFactor = 0.999999;
272 p.scale(scaleFactor, scaleFactor);
273 QGradient grad = gradient;
274 grad.setCoordinateMode(QGradient::StretchToDeviceMode);
275 p.fillRect(QRect(0, 0, size.width(), size.height()), grad);
276 p.drawRect(QRect(0, 0, size.width() - 1, size.height() - 1));
278 return QPixmap::fromImage(image);
307 if (gradient.type() != QGradient::ConicalGradient) {
309 switch (gradient.spread()) {
310 case QGradient::PadSpread:
313 case QGradient::ReflectSpread:
314 spread =
"reflect"_L1;
316 case QGradient::RepeatSpread:
317 spread =
"repeat"_L1;
320 qWarning() <<
"QtGradientUtils::styleSheetParameters(): gradient spread" << gradient.spread() <<
"not supported!";
323 result <<
"spread:"_L1 + spread;
326 switch (gradient.type()) {
327 case QGradient::LinearGradient: {
328 const QLinearGradient *linearGradient =
static_cast<
const QLinearGradient*>(&gradient);
329 result <<
"x1:"_L1 + QString::number(linearGradient->start().x())
330 <<
"y1:"_L1 + QString::number(linearGradient->start().y())
331 <<
"x2:"_L1 + QString::number(linearGradient->finalStop().x())
332 <<
"y2:"_L1 + QString::number(linearGradient->finalStop().y());
335 case QGradient::RadialGradient: {
336 const QRadialGradient *radialGradient =
static_cast<
const QRadialGradient*>(&gradient);
337 result <<
"cx:"_L1 + QString::number(radialGradient->center().x())
338 <<
"cy:"_L1 + QString::number(radialGradient->center().y())
339 <<
"radius:"_L1 + QString::number(radialGradient->radius())
340 <<
"fx:"_L1 + QString::number(radialGradient->focalPoint().x())
341 <<
"fy:"_L1 + QString::number(radialGradient->focalPoint().y());
344 case QGradient::ConicalGradient: {
345 const QConicalGradient *conicalGradient =
static_cast<
const QConicalGradient*>(&gradient);
346 result <<
"cx:"_L1 + QString::number(conicalGradient->center().x())
347 <<
"cy:"_L1 + QString::number(conicalGradient->center().y())
348 <<
"angle:"_L1 + QString::number(conicalGradient->angle());
352 qWarning() <<
"QtGradientUtils::styleSheetParameters(): gradient type" << gradient.type() <<
"not supported!";
362 const QGradientStops &stops = gradient.stops();
363 for (
const QGradientStop &stop : stops) {
364 const QColor color = stop.second;
366 const QString stopDescription =
"stop:"_L1 + QString::number(stop.first) +
" rgba("_L1
367 + QString::number(color.red()) +
", "_L1
368 + QString::number(color.green()) +
", "_L1
369 + QString::number(color.blue()) +
", "_L1
370 + QString::number(color.alpha()) + QLatin1Char(
')');
371 result << stopDescription;