mirror of https://github.com/qt/qtbase.git
QStyleHelper::uniqueName(): Improve palette pixmap cache key
Use QDataStream to obtain cache key for a palettes that are different from the default QPalette. This results in unique keys for palettes created from QStyleSheetStyle's render rules. Task-number: QTBUG-56743 Change-Id: Icbfe165f705ef3e1c9e88cfc9dca88ff1d1e81e6 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
This commit is contained in:
parent
356f5bbac3
commit
d7bcdc3a44
|
@ -43,6 +43,8 @@
|
||||||
|
|
||||||
#include "qstylehelper_p.h"
|
#include "qstylehelper_p.h"
|
||||||
#include <qstringbuilder.h>
|
#include <qstringbuilder.h>
|
||||||
|
#include <qdatastream.h>
|
||||||
|
#include <qcryptographichash.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
@ -56,7 +58,6 @@ QString uniqueName(const QString &key, const QStyleOption *option, const QSize &
|
||||||
QString tmp = key % HexString<uint>(option->state)
|
QString tmp = key % HexString<uint>(option->state)
|
||||||
% HexString<uint>(option->direction)
|
% HexString<uint>(option->direction)
|
||||||
% HexString<uint>(complexOption ? uint(complexOption->activeSubControls) : 0u)
|
% HexString<uint>(complexOption ? uint(complexOption->activeSubControls) : 0u)
|
||||||
% HexString<quint64>(option->palette.cacheKey())
|
|
||||||
% HexString<uint>(size.width())
|
% HexString<uint>(size.width())
|
||||||
% HexString<uint>(size.height());
|
% HexString<uint>(size.height());
|
||||||
|
|
||||||
|
@ -67,6 +68,25 @@ QString uniqueName(const QString &key, const QStyleOption *option, const QSize &
|
||||||
% QLatin1Char(spinBox->frame ? '1' : '0'); ;
|
% QLatin1Char(spinBox->frame ? '1' : '0'); ;
|
||||||
}
|
}
|
||||||
#endif // QT_NO_SPINBOX
|
#endif // QT_NO_SPINBOX
|
||||||
|
|
||||||
|
// QTBUG-56743, try to create a palette cache key reflecting the value,
|
||||||
|
// as leaks may occur in conjunction with QStyleSheetStyle/QRenderRule modifying
|
||||||
|
// palettes when using QPalette::cacheKey()
|
||||||
|
if (option->palette != QGuiApplication::palette()) {
|
||||||
|
tmp.append(QLatin1Char('P'));
|
||||||
|
#ifndef QT_NO_DATASTREAM
|
||||||
|
QByteArray key;
|
||||||
|
key.reserve(5120); // Observed 5040B for a serialized palette on 64bit
|
||||||
|
{
|
||||||
|
QDataStream str(&key, QIODevice::WriteOnly);
|
||||||
|
str << option->palette;
|
||||||
|
}
|
||||||
|
const QByteArray sha1 = QCryptographicHash::hash(key, QCryptographicHash::Sha1).toHex();
|
||||||
|
tmp.append(QString::fromLatin1(sha1));
|
||||||
|
#else // QT_NO_DATASTREAM
|
||||||
|
tmp.append(QString::number(option->palette.cacheKey(), 16));
|
||||||
|
#endif // !QT_NO_DATASTREAM
|
||||||
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue