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;
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);\
280 CHECK(doc.
isObject(),
"Parse Error: Expected root object" << s_root);
283 CHECK(root.
contains(s_root),
"Parse Error: Expected root object" << s_root);
284 CHECK(root[s_root][s_signals].isArray(),
"Parse Error: Expected array" << s_signals);
286 const QJsonArray &sigs = root[s_root][s_signals].toArray();
287 CHECK((sigs.
count() > 0),
"Parse Error: Found empty array" << s_signals);
290 CHECK(sig->isObject(),
"Parse Error: Expected object array" << s_signals);
292 CHECK(
obj.contains(s_dbusLocation),
"Parse Error: Expected key" << s_dbusLocation);
293 CHECK(
obj.contains(s_dbusKey),
"Parse Error: Expected key" << s_dbusKey);
294 CHECK(
obj.contains(s_provider),
"Parse Error: Expected key" << s_provider);
295 CHECK(
obj.contains(s_setting),
"Parse Error: Expected key" << s_setting);
298 const QString &providerString =
obj[s_provider].toString();
299 const QString &settingString =
obj[s_setting].toString();
304 m_signalMap.
insert(dkey, ChangeSignal(provider, setting));
309 if (m_signalMap.
count() > 0)
312 qCWarning(lcQpaThemeDBus) <<
"No data imported from" <<
fileName <<
"falling back to default.";
319 qCDebug(lcQpaThemeDBus) <<
"Listening to" <<
count <<
"signals:";
321 qDebug() <<
it.key().key <<
it.key().location <<
"mapped to"
322 <<
it.value().provider <<
it.value().setting;
328void QGenericUnixThemeDBusListener::saveJson(
const QString &
fileName)
const
340 const DBusKey &dkey = sig.key();
341 const ChangeSignal &csig = sig.value();
343 obj[s_dbusLocation] = dkey.location;
344 obj[s_dbusKey] = dkey.key;
346 .valueToKey(
static_cast<int>(csig.provider)));
348 .valueToKey(
static_cast<int>(csig.setting)));
352 obj[s_signals] = sigs;
360void QGenericUnixThemeDBusListener::populateSignalMap()
365 loadJson(loadJsonFile);
369 m_signalMap.
insert(DBusKey(
"org.kde.kdeglobals.KDE"_L1,
"widgetStyle"_L1),
372 m_signalMap.
insert(DBusKey(
"org.kde.kdeglobals.General"_L1,
"ColorScheme"_L1),
375 m_signalMap.
insert(DBusKey(
"org.gnome.desktop.interface"_L1,
"gtk-theme"_L1),
378 m_signalMap.
insert(DBusKey(
"org.freedesktop.appearance"_L1,
"color-scheme"_L1),
383 saveJson(saveJsonFile);
386std::optional<QGenericUnixThemeDBusListener::ChangeSignal>
390 std::optional<QGenericUnixThemeDBusListener::ChangeSignal>
ret;
392 ret.emplace(m_signalMap.
value(dkey));
400 if (!sig.has_value())
434 return &
d->systemFont;
436 return &
d->fixedFont;
448 if (homeIconDir.
isDir())
462 if (pixmapsIconsDir.
isDir())
477#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
522#if QT_CONFIG(mimetype)
540#if QT_CONFIG(settings)
545 QKdeThemePrivate(
const QStringList &kdeDirs,
int kdeVersion);
550 return kdeDir +
"/kdeglobals"_L1;
551 return kdeDir +
"/share/config/kdeglobals"_L1;
561 const int kdeVersion;
568 int toolBarIconSize = 0;
569 bool singleClick =
true;
570 bool showIconsOnPushButtons =
true;
571 int wheelScrollLines = 3;
572 int doubleClickInterval = 400;
573 int startDragDist = 10;
574 int startDragTime = 500;
575 int cursorBlinkRate = 1000;
581 std::unique_ptr<QGenericUnixThemeDBusListener>
dbus;
599 qCDebug(lcQpaThemeDBus) <<
"KDE color theme changed to:" <<
value;
602 qCDebug(lcQpaThemeDBus) <<
"KDE global theme changed to:" <<
value;
605 qCDebug(lcQpaThemeDBus) <<
"KDE application style changed to:" <<
value;
612bool QKdeThemePrivate::initDbus()
621 settingChangedHandler(provider, setting,
value);
628QKdeThemePrivate::QKdeThemePrivate(
const QStringList &kdeDirs,
int kdeVersion)
629 : kdeDirs(kdeDirs), kdeVersion(kdeVersion)
636void QKdeThemePrivate::refresh()
654 readKdeSystemPalette(kdeDirs, kdeVersion, kdeSettings, &systemPalette);
658 const QVariant styleValue = readKdeSetting(
QStringLiteral(
"widgetStyle"), kdeDirs, kdeVersion, kdeSettings);
666 kdeVersion, kdeSettings);
669 updateColorScheme(colorScheme.
toString());
673 const QVariant singleClickValue = readKdeSetting(
QStringLiteral(
"KDE/SingleClick"), kdeDirs, kdeVersion, kdeSettings);
674 if (singleClickValue.
isValid())
675 singleClick = singleClickValue.
toBool();
677 const QVariant showIconsOnPushButtonsValue = readKdeSetting(
QStringLiteral(
"KDE/ShowIconsOnPushButtons"), kdeDirs, kdeVersion, kdeSettings);
678 if (showIconsOnPushButtonsValue.
isValid())
679 showIconsOnPushButtons = showIconsOnPushButtonsValue.
toBool();
681 const QVariant themeValue = readKdeSetting(
QStringLiteral(
"Icons/Theme"), kdeDirs, kdeVersion, kdeSettings);
683 iconThemeName = themeValue.
toString();
685 const QVariant toolBarIconSizeValue = readKdeSetting(
QStringLiteral(
"ToolbarIcons/Size"), kdeDirs, kdeVersion, kdeSettings);
686 if (toolBarIconSizeValue.
isValid())
687 toolBarIconSize = toolBarIconSizeValue.
toInt();
689 const QVariant toolbarStyleValue = readKdeSetting(
QStringLiteral(
"Toolbar style/ToolButtonStyle"), kdeDirs, kdeVersion, kdeSettings);
690 if (toolbarStyleValue.
isValid()) {
692 if (toolBarStyle ==
"TextBesideIcon"_L1)
694 else if (toolBarStyle ==
"TextOnly"_L1)
696 else if (toolBarStyle ==
"TextUnderIcon"_L1)
700 const QVariant wheelScrollLinesValue = readKdeSetting(
QStringLiteral(
"KDE/WheelScrollLines"), kdeDirs, kdeVersion, kdeSettings);
701 if (wheelScrollLinesValue.
isValid())
702 wheelScrollLines = wheelScrollLinesValue.
toInt();
704 const QVariant doubleClickIntervalValue = readKdeSetting(
QStringLiteral(
"KDE/DoubleClickInterval"), kdeDirs, kdeVersion, kdeSettings);
705 if (doubleClickIntervalValue.
isValid())
706 doubleClickInterval = doubleClickIntervalValue.
toInt();
708 const QVariant startDragDistValue = readKdeSetting(
QStringLiteral(
"KDE/StartDragDist"), kdeDirs, kdeVersion, kdeSettings);
709 if (startDragDistValue.
isValid())
710 startDragDist = startDragDistValue.
toInt();
712 const QVariant startDragTimeValue = readKdeSetting(
QStringLiteral(
"KDE/StartDragTime"), kdeDirs, kdeVersion, kdeSettings);
713 if (startDragTimeValue.
isValid())
714 startDragTime = startDragTimeValue.
toInt();
716 const QVariant cursorBlinkRateValue = readKdeSetting(
QStringLiteral(
"KDE/CursorBlinkRate"), kdeDirs, kdeVersion, kdeSettings);
717 if (cursorBlinkRateValue.
isValid()) {
718 cursorBlinkRate = cursorBlinkRateValue.
toInt();
719 cursorBlinkRate = cursorBlinkRate > 0 ?
qBound(200, cursorBlinkRate, 2000) : 0;
723 if (
QFont *systemFont = kdeFont(readKdeSetting(
QStringLiteral(
"font"), kdeDirs, kdeVersion, kdeSettings)))
728 if (
QFont *fixedFont = kdeFont(readKdeSetting(
QStringLiteral(
"fixed"), kdeDirs, kdeVersion, kdeSettings))) {
736 if (
QFont *menuFont = kdeFont(readKdeSetting(
QStringLiteral(
"menuFont"), kdeDirs, kdeVersion, kdeSettings))) {
741 if (
QFont *toolBarFont = kdeFont(readKdeSetting(
QStringLiteral(
"toolBarFont"), kdeDirs, kdeVersion, kdeSettings)))
753 for (
const QString &kdeDir : kdeDirs) {
756 const QString kdeGlobalsPath = kdeGlobals(kdeDir, kdeVersion);
757 if (
QFileInfo(kdeGlobalsPath).isReadable()) {
775 if (!
value.isValid())
788 const QColor defaultWindowBackground(214, 210, 208);
789 const QColor defaultButtonBackground(223, 220, 217);
790 *pal =
QPalette(defaultButtonBackground, defaultWindowBackground);
846const char *QKdeTheme::name =
"kde";
848QKdeTheme::QKdeTheme(
const QStringList& kdeDirs,
int kdeVersion)
863 if (fontValue.
userType() == QMetaType::QStringList) {
867 fontDescription =
list.join(u
',');
870 fontDescription = fontFamily = fontValue.
toString();
872 if (!fontDescription.
isEmpty()) {
886 for (
const QString &candidate : kdeDirs) {
896 Q_D(
const QKdeTheme);
901 return QVariant(
d->showIconsOnPushButtons);
911 return QVariant(
d->iconFallbackThemeName);
913 return QVariant(
d->kdeIconThemeSearchPaths(
d->kdeDirs));
919 return QVariant(
int(KdeKeyboardScheme));
944QIcon QKdeTheme::fileIcon(
const QFileInfo &fileInfo, QPlatformTheme::IconOptions)
const
946#if QT_CONFIG(mimetype)
947 return xdgFileIcon(fileInfo);
956 return d_func()->m_colorScheme;
998 Q_D(
const QKdeTheme);
999 return d->resources.palettes[
type];
1002const QFont *QKdeTheme::font(Font
type)
const
1004 Q_D(
const QKdeTheme);
1005 return d->resources.fonts[
type];
1011 const int kdeVersion = kdeVersionBA.
toInt();
1028 if (!kdeHomePathVar.
isEmpty())
1029 kdeDirs += kdeHomePathVar;
1036 if (
QFileInfo(kdeVersionHomePath).isDir())
1037 kdeDirs += kdeVersionHomePath;
1041 kdeDirs += kdeHomePath;
1044 if (
QFileInfo(kdeRcPath).isReadable()) {
1051 if (
QFileInfo(kdeVersionPrefix).isDir())
1052 kdeDirs += kdeVersionPrefix;
1054 kdeDirs.removeDuplicates();
1055 if (kdeDirs.isEmpty()) {
1056 qWarning(
"Unable to determine KDE dirs");
1060 return new QKdeTheme(kdeDirs, kdeVersion);
1072#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
1118 std::unique_ptr<QGenericUnixThemeDBusListener>
dbus;
1139bool QGnomeThemePrivate::initDbus()
1154 updateColorScheme(
value);
1224#if QT_CONFIG(mimetype)
1225 return xdgFileIcon(fileInfo);
1239 return d->systemFont;
1241 return d->fixedFont;
1262 return d_func()->m_colorScheme;
1267#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
1303#if QT_CONFIG(settings)
1319 gtkBasedEnvironments <<
"GNOME"
1326 for (
const QByteArray &desktopName : desktopNames) {
1327 if (desktopEnvironment ==
"KDE") {
1328#if QT_CONFIG(settings)
1331 }
else if (gtkBasedEnvironments.
contains(desktopName)) {
1340 result.push_back(
s.startsWith(
"x-"_L1) ?
s.mid(2) :
s);
1351#include "qgenericunixthemes.moc"
const QColor & color() const
Returns the brush color.
int toInt(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an int using base base, which is ten by default.
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.
\inmodule QtCore \reentrant
QString absoluteFilePath() const
Returns an absolute path including the file name.
bool isDir() const
Returns true if this object points to a directory or to a symbolic link to a directory.
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.
int pointSize() const
Returns the point size of the font.
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()
Qt::ColorScheme m_colorScheme
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.
T value(const Key &key) const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
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.
QList< QSize > availableSizes(Mode mode=Normal, State state=Off) const
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)
QMimeType mimeTypeForFile(const QString &fileName, MatchMode mode=MatchDefault) const
Returns a MIME type for the file named fileName using mode.
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
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...
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
float toFloat(bool *ok=nullptr) const
Returns the string converted to a float value.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
QString left(qsizetype n) const
Returns a substring that contains the n leftmost characters of the string.
bool isValid() const
Returns true if the storage type of this variant is not QMetaType::UnknownType; otherwise returns fal...
int toInt(bool *ok=nullptr) const
Returns the variant as an int if the variant has userType() \l QMetaType::Int, \l QMetaType::Bool,...
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
bool toBool() const
Returns the variant as a bool if the variant has userType() Bool.
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 >
QStringList toStringList() const
Returns the variant as a QStringList if the variant has userType() \l QMetaType::QStringList,...
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
constexpr bool operator<(const timespec &t1, const timespec &t2)
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
static QStringList styleNames()
QFileInfo fi("c:/temp/foo")
[newstuff]
QSettings settings("MySoft", "Star Runner")
[0]
\inmodule QtCore\reentrant
bool contains(const AT &t) const noexcept