8#include <QGuiApplication>
14#include <QLoggingCategory>
16#include <QStandardPaths>
18#if QT_CONFIG(mimetype)
19#include <QMimeDatabase>
21#if QT_CONFIG(settings)
25#include <qpa/qplatformfontdatabase.h>
26#include <qpa/qplatformintegration.h>
27#include <qpa/qplatformservices.h>
28#include <qpa/qplatformdialoghelper.h>
29#include <qpa/qplatformtheme_p.h>
31#include <private/qguiapplication_p.h>
33#include <QDBusConnectionInterface>
34#include <private/qdbusplatformmenu_p.h>
35#include <private/qdbusmenubar_p.h>
36#include <private/qflatmap_p.h>
37#include <QJsonDocument>
41#include <QJsonParseError>
43#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
44#include <private/qdbustrayicon_p.h>
80#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
82 static bool dbusTrayAvailable =
false;
83 static bool dbusTrayAvailableKnown =
false;
84 if (!dbusTrayAvailableKnown) {
87 dbusTrayAvailable =
true;
88 dbusTrayAvailableKnown =
true;
89 qCDebug(qLcTray) <<
"D-Bus tray available:" << dbusTrayAvailable;
91 return dbusTrayAvailable;
103 constexpr int defaultCursorSize = 24;
105 static const int s = xCursorSize > 0 ? xCursorSize : defaultCursorSize;
114 if (
const auto iface =
connection.interface())
115 return iface->isServiceRegistered(registrarService);
122 return dbusGlobalMenuAvailable;
173 bool operator<(
const DBusKey &
other)
const
195 QFlatMap <DBusKey, ChangeSignal> m_signalMap;
201 void populateSignalMap();
226 const bool dBusRunning =
dbus.isConnected();
227 bool dBusSignalConnected =
false;
228#define LOG service << path << interface << signal;
232 qRegisterMetaType<QDBusVariant>();
237 if (dBusSignalConnected) {
243 qCWarning(lcQpaThemeDBus) <<
"DBus connection failed:" <<
LOG;
246 qCWarning(lcQpaThemeDBus) <<
"Session DBus not running.";
248 qCWarning(lcQpaThemeDBus) <<
"Application will not react to setting changes.\n"
249 <<
"Check your DBus installation.";
257#define CHECK(cond, warning)\
259 qCWarning(lcQpaThemeDBus) << fileName << warning << "Falling back to default.";\
263#define PARSE(var, enumeration, string)\
267 const int val = QMetaEnum::fromType<enumeration>().keyToValue(string.toLatin1(), &success);\
268 CHECK(success, "Parse Error: Invalid value" << string << "for" << #var);\
269 var = static_cast<enumeration>(val);\
279 CHECK(doc.
isObject(),
"Parse Error: Expected root object" << s_root);
282 CHECK(root.
contains(s_root),
"Parse Error: Expected root object" << s_root);
283 CHECK(root[s_root][s_signals].isArray(),
"Parse Error: Expected array" << s_signals);
285 const QJsonArray &sigs = root[s_root][s_signals].toArray();
286 CHECK((sigs.
count() > 0),
"Parse Error: Found empty array" << s_signals);
289 CHECK(sig->isObject(),
"Parse Error: Expected object array" << s_signals);
291 CHECK(
obj.contains(s_dbusLocation),
"Parse Error: Expected key" << s_dbusLocation);
292 CHECK(
obj.contains(s_dbusKey),
"Parse Error: Expected key" << s_dbusKey);
293 CHECK(
obj.contains(s_provider),
"Parse Error: Expected key" << s_provider);
294 CHECK(
obj.contains(s_setting),
"Parse Error: Expected key" << s_setting);
297 const QString &providerString =
obj[s_provider].toString();
298 const QString &settingString =
obj[s_setting].toString();
303 m_signalMap.
insert(dkey, ChangeSignal(provider, setting));
308 if (m_signalMap.
count() > 0)
311 qCWarning(lcQpaThemeDBus) <<
"No data imported from" <<
fileName <<
"falling back to default.";
318 qCDebug(lcQpaThemeDBus) <<
"Listening to" <<
count <<
"signals:";
320 qDebug() <<
it.key().key <<
it.key().location <<
"mapped to"
321 <<
it.value().provider <<
it.value().setting;
327void QGenericUnixThemeDBusListener::saveJson(
const QString &
fileName)
const
339 const DBusKey &dkey = sig.key();
340 const ChangeSignal &csig = sig.value();
342 obj[s_dbusLocation] = dkey.location;
343 obj[s_dbusKey] = dkey.key;
345 .valueToKey(
static_cast<int>(csig.provider)));
347 .valueToKey(
static_cast<int>(csig.setting)));
351 obj[s_signals] = sigs;
359void QGenericUnixThemeDBusListener::populateSignalMap()
363 if (!loadJsonFile.isEmpty())
364 loadJson(loadJsonFile);
368 m_signalMap.
insert(DBusKey(
"org.kde.kdeglobals.KDE"_L1,
"widgetStyle"_L1),
371 m_signalMap.
insert(DBusKey(
"org.kde.kdeglobals.General"_L1,
"ColorScheme"_L1),
374 m_signalMap.
insert(DBusKey(
"org.gnome.desktop.interface"_L1,
"gtk-theme"_L1),
377 m_signalMap.
insert(DBusKey(
"org.freedesktop.appearance"_L1,
"color-scheme"_L1),
381 if (!saveJsonFile.isEmpty())
382 saveJson(saveJsonFile);
385std::optional<QGenericUnixThemeDBusListener::ChangeSignal>
389 std::optional<QGenericUnixThemeDBusListener::ChangeSignal>
ret;
391 ret.emplace(m_signalMap.
value(dkey));
399 if (!sig.has_value())
433 return &
d->systemFont;
435 return &
d->fixedFont;
447 if (homeIconDir.isDir())
448 paths.prepend(homeIconDir.absoluteFilePath());
461 if (pixmapsIconsDir.isDir())
462 paths.append(pixmapsIconsDir.absoluteFilePath());
476#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
521#if QT_CONFIG(mimetype)
539#if QT_CONFIG(settings)
544 QKdeThemePrivate(
const QStringList &kdeDirs,
int kdeVersion);
549 return kdeDir +
"/kdeglobals"_L1;
550 return kdeDir +
"/share/config/kdeglobals"_L1;
555 static void readKdeSystemPalette(
const QStringList &kdeDirs,
int kdeVersion, QHash<QString, QSettings*> &kdeSettings,
QPalette *pal);
560 const int kdeVersion;
567 int toolBarIconSize = 0;
568 bool singleClick =
true;
569 bool showIconsOnPushButtons =
true;
570 int wheelScrollLines = 3;
571 int doubleClickInterval = 400;
572 int startDragDist = 10;
573 int startDragTime = 500;
574 int cursorBlinkRate = 1000;
580 std::unique_ptr<QGenericUnixThemeDBusListener>
dbus;
598 qCDebug(lcQpaThemeDBus) <<
"KDE color theme changed to:" <<
value;
601 qCDebug(lcQpaThemeDBus) <<
"KDE global theme changed to:" <<
value;
604 qCDebug(lcQpaThemeDBus) <<
"KDE application style changed to:" <<
value;
611bool QKdeThemePrivate::initDbus()
620 settingChangedHandler(provider, setting,
value);
627QKdeThemePrivate::QKdeThemePrivate(
const QStringList &kdeDirs,
int kdeVersion)
628 : kdeDirs(kdeDirs), kdeVersion(kdeVersion)
635void QKdeThemePrivate::refresh()
650 QHash<QString, QSettings*> kdeSettings;
653 readKdeSystemPalette(kdeDirs, kdeVersion, kdeSettings, &systemPalette);
657 const QVariant styleValue = readKdeSetting(
QStringLiteral(
"widgetStyle"), kdeDirs, kdeVersion, kdeSettings);
665 kdeVersion, kdeSettings);
668 updateColorScheme(colorScheme.
toString());
672 const QVariant singleClickValue = readKdeSetting(
QStringLiteral(
"KDE/SingleClick"), kdeDirs, kdeVersion, kdeSettings);
673 if (singleClickValue.isValid())
674 singleClick = singleClickValue.toBool();
676 const QVariant showIconsOnPushButtonsValue = readKdeSetting(
QStringLiteral(
"KDE/ShowIconsOnPushButtons"), kdeDirs, kdeVersion, kdeSettings);
677 if (showIconsOnPushButtonsValue.isValid())
678 showIconsOnPushButtons = showIconsOnPushButtonsValue.toBool();
680 const QVariant themeValue = readKdeSetting(
QStringLiteral(
"Icons/Theme"), kdeDirs, kdeVersion, kdeSettings);
681 if (themeValue.isValid())
682 iconThemeName = themeValue.toString();
684 const QVariant toolBarIconSizeValue = readKdeSetting(
QStringLiteral(
"ToolbarIcons/Size"), kdeDirs, kdeVersion, kdeSettings);
685 if (toolBarIconSizeValue.isValid())
686 toolBarIconSize = toolBarIconSizeValue.toInt();
688 const QVariant toolbarStyleValue = readKdeSetting(
QStringLiteral(
"Toolbar style/ToolButtonStyle"), kdeDirs, kdeVersion, kdeSettings);
689 if (toolbarStyleValue.isValid()) {
690 const QString toolBarStyle = toolbarStyleValue.toString();
691 if (toolBarStyle ==
"TextBesideIcon"_L1)
693 else if (toolBarStyle ==
"TextOnly"_L1)
695 else if (toolBarStyle ==
"TextUnderIcon"_L1)
699 const QVariant wheelScrollLinesValue = readKdeSetting(
QStringLiteral(
"KDE/WheelScrollLines"), kdeDirs, kdeVersion, kdeSettings);
700 if (wheelScrollLinesValue.isValid())
701 wheelScrollLines = wheelScrollLinesValue.toInt();
703 const QVariant doubleClickIntervalValue = readKdeSetting(
QStringLiteral(
"KDE/DoubleClickInterval"), kdeDirs, kdeVersion, kdeSettings);
704 if (doubleClickIntervalValue.isValid())
705 doubleClickInterval = doubleClickIntervalValue.toInt();
707 const QVariant startDragDistValue = readKdeSetting(
QStringLiteral(
"KDE/StartDragDist"), kdeDirs, kdeVersion, kdeSettings);
708 if (startDragDistValue.isValid())
709 startDragDist = startDragDistValue.toInt();
711 const QVariant startDragTimeValue = readKdeSetting(
QStringLiteral(
"KDE/StartDragTime"), kdeDirs, kdeVersion, kdeSettings);
712 if (startDragTimeValue.isValid())
713 startDragTime = startDragTimeValue.toInt();
715 const QVariant cursorBlinkRateValue = readKdeSetting(
QStringLiteral(
"KDE/CursorBlinkRate"), kdeDirs, kdeVersion, kdeSettings);
716 if (cursorBlinkRateValue.isValid()) {
717 cursorBlinkRate = cursorBlinkRateValue.toInt();
718 cursorBlinkRate = cursorBlinkRate > 0 ?
qBound(200, cursorBlinkRate, 2000) : 0;
722 if (
QFont *systemFont = kdeFont(readKdeSetting(
QStringLiteral(
"font"), kdeDirs, kdeVersion, kdeSettings)))
727 if (
QFont *fixedFont = kdeFont(readKdeSetting(
QStringLiteral(
"fixed"), kdeDirs, kdeVersion, kdeSettings))) {
735 if (
QFont *menuFont = kdeFont(readKdeSetting(
QStringLiteral(
"menuFont"), kdeDirs, kdeVersion, kdeSettings))) {
740 if (
QFont *toolBarFont = kdeFont(readKdeSetting(
QStringLiteral(
"toolBarFont"), kdeDirs, kdeVersion, kdeSettings)))
750QVariant QKdeThemePrivate::readKdeSetting(
const QString &
key,
const QStringList &kdeDirs,
int kdeVersion, QHash<QString, QSettings*> &kdeSettings)
752 for (
const QString &kdeDir : kdeDirs) {
755 const QString kdeGlobalsPath = kdeGlobals(kdeDir, kdeVersion);
758 kdeSettings.insert(kdeDir,
settings);
774 if (!
value.isValid())
783void QKdeThemePrivate::readKdeSystemPalette(
const QStringList &kdeDirs,
int kdeVersion, QHash<QString, QSettings*> &kdeSettings,
QPalette *pal)
787 const QColor defaultWindowBackground(214, 210, 208);
788 const QColor defaultButtonBackground(223, 220, 217);
789 *pal =
QPalette(defaultButtonBackground, defaultWindowBackground);
845const char *QKdeTheme::name =
"kde";
847QKdeTheme::QKdeTheme(
const QStringList& kdeDirs,
int kdeVersion)
855 if (fontValue.isValid()) {
862 if (fontValue.userType() == QMetaType::QStringList) {
866 fontDescription =
list.join(u
',');
869 fontDescription = fontFamily = fontValue.toString();
871 if (!fontDescription.isEmpty()) {
885 for (
const QString &candidate : kdeDirs) {
886 const QFileInfo fi(candidate + iconPath);
888 paths.append(fi.absoluteFilePath());
895 Q_D(
const QKdeTheme);
900 return QVariant(
d->showIconsOnPushButtons);
910 return QVariant(
d->iconFallbackThemeName);
912 return QVariant(
d->kdeIconThemeSearchPaths(
d->kdeDirs));
918 return QVariant(
int(KdeKeyboardScheme));
943QIcon QKdeTheme::fileIcon(
const QFileInfo &fileInfo, QPlatformTheme::IconOptions)
const
945#if QT_CONFIG(mimetype)
946 return xdgFileIcon(fileInfo);
955 return d_func()->m_colorScheme;
997 Q_D(
const QKdeTheme);
998 return d->resources.palettes[
type];
1001const QFont *QKdeTheme::font(Font
type)
const
1003 Q_D(
const QKdeTheme);
1004 return d->resources.fonts[
type];
1010 const int kdeVersion = kdeVersionBA.toInt();
1027 if (!kdeHomePathVar.isEmpty())
1028 kdeDirs += kdeHomePathVar;
1031 if (!kdeDirsVar.isEmpty())
1035 if (
QFileInfo(kdeVersionHomePath).isDir())
1036 kdeDirs += kdeVersionHomePath;
1040 kdeDirs += kdeHomePath;
1046 kdeDirs += kdeSettings.value(
QStringLiteral(
"prefixes")).toStringList();
1050 if (
QFileInfo(kdeVersionPrefix).isDir())
1051 kdeDirs += kdeVersionPrefix;
1053 kdeDirs.removeDuplicates();
1054 if (kdeDirs.isEmpty()) {
1055 qWarning(
"Unable to determine KDE dirs");
1059 return new QKdeTheme(kdeDirs, kdeVersion);
1071#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
1108 qCDebug(lcQpaFonts) <<
"default fonts: system" << systemFont <<
"fixed" << fixedFont;
1117 std::unique_ptr<QGenericUnixThemeDBusListener>
dbus;
1138bool QGnomeThemePrivate::initDbus()
1153 updateColorScheme(
value);
1161 const auto oldColorScheme = m_colorScheme;
1170 if (oldColorScheme != m_colorScheme)
1223#if QT_CONFIG(mimetype)
1224 return xdgFileIcon(fileInfo);
1238 return d->systemFont;
1240 return d->fixedFont;
1261 return d_func()->m_colorScheme;
1266#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
1302#if QT_CONFIG(settings)
1317 QList<QByteArray> gtkBasedEnvironments;
1318 gtkBasedEnvironments <<
"GNOME"
1324 const QList<QByteArray> desktopNames = desktopEnvironment.
split(
':');
1325 for (
const QByteArray &desktopName : desktopNames) {
1326 if (desktopEnvironment ==
"KDE") {
1327#if QT_CONFIG(settings)
1330 }
else if (gtkBasedEnvironments.contains(desktopName)) {
1339 result.push_back(
s.startsWith(
"x-"_L1) ?
s.mid(2) :
s);
1350#include "qgenericunixthemes.moc"
const QColor & color() const
Returns the brush color.
QList< QByteArray > split(char sep) const
Splits the byte array into subarrays wherever sep occurs, and returns the list of those arrays.
The QColor class provides colors based on RGB, HSV or CMYK values.
int lightness() const noexcept
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
static QDBusConnection sessionBus()
Returns a QDBusConnection object opened with the session bus.
static QString homePath()
Returns the absolute path of the user's home directory.
void close() override
Calls QFileDevice::flush() and closes the file.
QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
static QString decodeName(const QByteArray &localFileName)
This does the reverse of QFile::encodeName() using localFileName.
bool exists() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool isEmpty() const noexcept
size_type count() const noexcept
bool contains(const Key &key) const
const_iterator constBegin() const
const_iterator constEnd() const
std::pair< iterator, bool > insert(const Key &key, const T &value)
T value(const Key &key, const T &defaultValue) const
bool fromString(const QString &)
Sets this font to match the description descrip.
void setStyleHint(StyleHint, StyleStrategy=PreferDefault)
Sets the style hint and strategy to hint and strategy, respectively.
QGenericUnixThemeDBusListener()
void settingChanged(QGenericUnixThemeDBusListener::Provider provider, QGenericUnixThemeDBusListener::Setting setting, const QString &value)
QGenericUnixThemePrivate()
QVariant themeHint(ThemeHint hint) const override
static QStringList iconFallbackPaths()
const QFont * font(Font type) const override
QPlatformMenuBar * createPlatformMenuBar() const override
static QPlatformTheme * createUnixTheme(const QString &name)
Creates a UNIX theme according to the detected desktop environment.
QPlatformSystemTrayIcon * createPlatformSystemTrayIcon() const override
Factory function for QSystemTrayIcon.
static QStringList xdgIconThemePaths()
static QStringList themeNames()
void configureFonts(const QString >kFontName) const
QGnomeTheme is a theme implementation for the Gnome desktop.
QPlatformMenuBar * createPlatformMenuBar() const override
virtual QString gtkFontName() const
QVariant themeHint(ThemeHint hint) const override
QPlatformSystemTrayIcon * createPlatformSystemTrayIcon() const override
Factory function for QSystemTrayIcon.
QIcon fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions={ }) const override
Return an icon for fileInfo, observing iconOptions.
Qt::ColorScheme colorScheme() const override
QString standardButtonText(int button) const override
Returns the text of a standard button.
const QFont * font(Font type) const override
static QPlatformIntegration * platformIntegration()
static bool desktopSettingsAware()
Returns true if Qt is set to use the system's standard colors, fonts, etc.; otherwise returns false.
QByteArray readAll()
Reads all remaining data from the device, and returns it as a byte array.
qint64 write(const char *data, qint64 len)
Writes at most maxSize bytes of data from data to the device.
The QIcon class provides scalable icons in different modes and states.
bool isNull() const
Returns true if the icon is empty; otherwise returns false.
static QIcon fromTheme(const QString &name)
\inmodule QtCore\reentrant
const_iterator constBegin() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item in the array.
const_iterator constEnd() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the ...
qsizetype count() const
Same as size().
void append(const QJsonValue &value)
Inserts value at the end of the array.
\inmodule QtCore\reentrant
QByteArray toJson(JsonFormat format=Indented) const
QJsonObject object() const
Returns the QJsonObject contained in the document.
bool isObject() const
Returns true if the document contains an object.
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=nullptr)
Parses json as a UTF-8 encoded JSON document, and creates a QJsonDocument from it.
\inmodule QtCore\reentrant
bool contains(const QString &key) const
Returns true if the object contains key key.
bool isEmpty() const noexcept
void push_back(parameter_type t)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
The QPalette class contains color groups for each widget state.
const QBrush & text() const
Returns the text foreground brush of the current color group.
const QColor & color(ColorGroup cg, ColorRole cr) const
Returns the color in the specified color group, used for the given color role.
void setBrush(ColorRole cr, const QBrush &brush)
Sets the brush for the given color role to the specified brush for all groups in the palette.
const QBrush & base() const
Returns the base brush of the current color group.
QVariant value(QAnyStringView key, const QVariant &defaultValue) const
Returns the value for setting key.
static QStringList locateAll(StandardLocation type, const QString &fileName, LocateOptions options=LocateFile)
[0]
static QStringList standardLocations(StandardLocation type)
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString left(qsizetype n) const &
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString mid(qsizetype position, qsizetype n=-1) const &
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
float toFloat(bool *ok=nullptr) const
Returns the string converted to a float value.
bool isValid() const
Returns true if the storage type of this variant is not QMetaType::UnknownType; otherwise returns fal...
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
static void handleThemeChange(QWindow *window=nullptr)
QPalette * palettes[QPlatformTheme::NPalettes]
QFont * fonts[QPlatformTheme::NFonts]
qDeleteAll(list.begin(), list.end())
QSet< QString >::iterator it
Combined button and popup list for selecting options.
@ ToolButtonTextUnderIcon
@ ToolButtonTextBesideIcon
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
DBusConnection const char DBusError * error
DBusConnection * connection
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static bool isDBusGlobalMenuAvailable()
#define CHECK(cond, warning)
static const char defaultFixedFontNameC[]
static const char defaultSystemFontNameC[]
static QString mouseCursorTheme()
static bool isDBusTrayAvailable()
static QList< QSize > availableXdgFileIconSizes()
#define PARSE(var, enumeration, string)
static bool checkDBusGlobalMenuAvailable()
static QSize mouseCursorSize()
#define Q_LOGGING_CATEGORY(name,...)
#define qCInfo(category,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
constexpr const T & qBound(const T &min, const T &val, const T &max)
static QString themeName()
GLenum GLsizei GLsizei GLint * values
[15]
GLsizei const GLfloat * v
[13]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLsizei const GLuint * paths
GLenum const void * fontName
GLfloat GLfloat GLfloat GLfloat h
GLsizei const GLchar *const * path
static void split(QT_FT_Vector *b)
#define QStringLiteral(str)
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)
QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
return device isReadable() ? device -> read(static_cast< char * >(buf), size) :-1
static QStringList styleNames()
QSettings settings("MySoft", "Star Runner")
[0]
\inmodule QtCore\reentrant