87 QDomElement colorElem = doc.createElement(
"colorData"_L1);
89 colorElem.setAttribute(
"r"_L1, QString::number(color.red()));
90 colorElem.setAttribute(
"g"_L1, QString::number(color.green()));
91 colorElem.setAttribute(
"b"_L1, QString::number(color.blue()));
92 colorElem.setAttribute(
"a"_L1, QString::number(color.alpha()));
111 QDomElement gradElem = doc.createElement(
"gradientData"_L1);
113 const QGradient::Type type = gradient.type();
114 gradElem.setAttribute(
"type"_L1, gradientTypeToString(type));
115 gradElem.setAttribute(
"spread"_L1, gradientSpreadToString(gradient.spread()));
116 gradElem.setAttribute(
"coordinateMode"_L1, gradientCoordinateModeToString(gradient.coordinateMode()));
118 const QGradientStops stops = gradient.stops();
119 for (
const QGradientStop &stop : stops)
120 gradElem.appendChild(saveGradientStop(doc, stop));
122 if (type == QGradient::LinearGradient) {
123 const QLinearGradient &g = *
static_cast<
const QLinearGradient *>(&gradient);
124 gradElem.setAttribute(
"startX"_L1, QString::number(g.start().x()));
125 gradElem.setAttribute(
"startY"_L1, QString::number(g.start().y()));
126 gradElem.setAttribute(
"endX"_L1, QString::number(g.finalStop().x()));
127 gradElem.setAttribute(
"endY"_L1, QString::number(g.finalStop().y()));
128 }
else if (type == QGradient::RadialGradient) {
129 const QRadialGradient &g = *
static_cast<
const QRadialGradient *>(&gradient);
130 gradElem.setAttribute(
"centerX"_L1, QString::number(g.center().x()));
131 gradElem.setAttribute(
"centerY"_L1, QString::number(g.center().y()));
132 gradElem.setAttribute(
"focalX"_L1, QString::number(g.focalPoint().x()));
133 gradElem.setAttribute(
"focalY"_L1, QString::number(g.focalPoint().y()));
134 gradElem.setAttribute(
"radius"_L1, QString::number(g.radius()));
135 }
else if (type == QGradient::ConicalGradient) {
136 const QConicalGradient &g = *
static_cast<
const QConicalGradient*>(&gradient);
137 gradElem.setAttribute(
"centerX"_L1, QString::number(g.center().x()));
138 gradElem.setAttribute(
"centerY"_L1, QString::number(g.center().y()));
139 gradElem.setAttribute(
"angle"_L1, QString::number(g.angle()));
167 if (elem.tagName() !=
"gradientData"_L1)
168 return QLinearGradient();
170 const QGradient::Type type = stringToGradientType(elem.attribute(
"type"_L1));
171 const QGradient::Spread spread = stringToGradientSpread(elem.attribute(
"spread"_L1));
172 const QGradient::CoordinateMode mode = stringToGradientCoordinateMode(elem.attribute(
"coordinateMode"_L1));
174 QGradient gradient = QLinearGradient();
176 if (type == QGradient::LinearGradient) {
178 g.setStart(elem.attribute(
"startX"_L1).toDouble(), elem.attribute(
"startY"_L1).toDouble());
179 g.setFinalStop(elem.attribute(
"endX"_L1).toDouble(), elem.attribute(
"endY"_L1).toDouble());
181 }
else if (type == QGradient::RadialGradient) {
183 g.setCenter(elem.attribute(
"centerX"_L1).toDouble(), elem.attribute(
"centerY"_L1).toDouble());
184 g.setFocalPoint(elem.attribute(
"focalX"_L1).toDouble(), elem.attribute(
"focalY"_L1).toDouble());
185 g.setRadius(elem.attribute(
"radius"_L1).toDouble());
187 }
else if (type == QGradient::ConicalGradient) {
189 g.setCenter(elem.attribute(
"centerX"_L1).toDouble(), elem.attribute(
"centerY"_L1).toDouble());
190 g.setAngle(elem.attribute(
"angle"_L1).toDouble());
194 QDomElement stopElem = elem.firstChildElement();
195 while (!stopElem.isNull()) {
196 QGradientStop stop = loadGradientStop(stopElem);
198 gradient.setColorAt(stop.first, stop.second);
200 stopElem = stopElem.nextSiblingElement();
203 gradient.setSpread(spread);
204 gradient.setCoordinateMode(mode);
213 QDomElement rootElem = doc.createElement(
"gradients"_L1);
215 QMap<QString, QGradient> grads = manager->gradients();
216 for (
auto itGrad = grads.cbegin(), end = grads.cend(); itGrad != end; ++itGrad) {
217 QDomElement idElem = doc.createElement(
"gradient"_L1);
218 idElem.setAttribute(
"name"_L1, itGrad.key());
219 QDomElement gradElem = saveGradient(doc, itGrad.value());
220 idElem.appendChild(gradElem);
222 rootElem.appendChild(idElem);
225 doc.appendChild(rootElem);
227 return doc.toString();
235 doc.setContent(state);
237 QDomElement rootElem = doc.documentElement();
239 QDomElement gradElem = rootElem.firstChildElement();
240 while (!gradElem.isNull()) {
241 const QString name = gradElem.attribute(
"name"_L1);
242 const QGradient gradient = loadGradient(gradElem.firstChildElement());
244 manager->addGradient(name, gradient);
245 gradElem = gradElem.nextSiblingElement();
250 bool checkeredBackground)
252 QImage image(size, QImage::Format_ARGB32);
254 p.setCompositionMode(QPainter::CompositionMode_Source);
256 if (checkeredBackground) {
258 QPixmap pm(2 * pixSize, 2 * pixSize);
261 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
262 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
263 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
264 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
266 p.setBrushOrigin((size.width() % pixSize + pixSize) / 2, (size.height() % pixSize + pixSize) / 2);
267 p.fillRect(0, 0, size.width(), size.height(), pm);
268 p.setBrushOrigin(0, 0);
269 p.setCompositionMode(QPainter::CompositionMode_SourceOver);
272 const qreal scaleFactor = 0.999999;
273 p.scale(scaleFactor, scaleFactor);
274 QGradient grad = gradient;
275 grad.setCoordinateMode(QGradient::StretchToDeviceMode);
276 p.fillRect(QRect(0, 0, size.width(), size.height()), grad);
277 p.drawRect(QRect(0, 0, size.width() - 1, size.height() - 1));
279 return QPixmap::fromImage(image);
308 if (gradient.type() != QGradient::ConicalGradient) {
310 switch (gradient.spread()) {
311 case QGradient::PadSpread:
314 case QGradient::ReflectSpread:
315 spread =
"reflect"_L1;
317 case QGradient::RepeatSpread:
318 spread =
"repeat"_L1;
321 qWarning() <<
"QtGradientUtils::styleSheetParameters(): gradient spread" << gradient.spread() <<
"not supported!";
324 result <<
"spread:"_L1 + spread;
327 switch (gradient.type()) {
328 case QGradient::LinearGradient: {
329 const QLinearGradient *linearGradient =
static_cast<
const QLinearGradient*>(&gradient);
330 result <<
"x1:"_L1 + QString::number(linearGradient->start().x())
331 <<
"y1:"_L1 + QString::number(linearGradient->start().y())
332 <<
"x2:"_L1 + QString::number(linearGradient->finalStop().x())
333 <<
"y2:"_L1 + QString::number(linearGradient->finalStop().y());
336 case QGradient::RadialGradient: {
337 const QRadialGradient *radialGradient =
static_cast<
const QRadialGradient*>(&gradient);
338 result <<
"cx:"_L1 + QString::number(radialGradient->center().x())
339 <<
"cy:"_L1 + QString::number(radialGradient->center().y())
340 <<
"radius:"_L1 + QString::number(radialGradient->radius())
341 <<
"fx:"_L1 + QString::number(radialGradient->focalPoint().x())
342 <<
"fy:"_L1 + QString::number(radialGradient->focalPoint().y());
345 case QGradient::ConicalGradient: {
346 const QConicalGradient *conicalGradient =
static_cast<
const QConicalGradient*>(&gradient);
347 result <<
"cx:"_L1 + QString::number(conicalGradient->center().x())
348 <<
"cy:"_L1 + QString::number(conicalGradient->center().y())
349 <<
"angle:"_L1 + QString::number(conicalGradient->angle());
353 qWarning() <<
"QtGradientUtils::styleSheetParameters(): gradient type" << gradient.type() <<
"not supported!";
363 const QGradientStops &stops = gradient.stops();
364 for (
const QGradientStop &stop : stops) {
365 const QColor color = stop.second;
367 const QString stopDescription =
"stop:"_L1 + QString::number(stop.first) +
" rgba("_L1
368 + QString::number(color.red()) +
", "_L1
369 + QString::number(color.green()) +
", "_L1
370 + QString::number(color.blue()) +
", "_L1
371 + QString::number(color.alpha()) + QLatin1Char(
')');
372 result << stopDescription;