Merge 5.14 into 5.14.1

Change-Id: Ie90edfd16f48e1907fd18288473ac403f62b9032
This commit is contained in:
Kari Oikarinen 2020-01-15 19:08:18 +02:00
commit 4f55c41816
109 changed files with 1077 additions and 684 deletions

View File

@ -1457,6 +1457,11 @@ Configure with '-qreal float' to create a build that is binary-compatible with 5
{ {
"type": "emccVersion", "type": "emccVersion",
"condition": "config.wasm" "condition": "config.wasm"
},
{
"type": "error",
"condition": "config.ios && features.debug && !features.debug_and_release",
"message": "Debug build wihtout Release build is not currently supported on ios see QTBUG-71990. Use -debug-and-release."
} }
], ],

View File

@ -3,7 +3,7 @@
dita.metadata.default.author = Qt Project dita.metadata.default.author = Qt Project
dita.metadata.default.permissions = all dita.metadata.default.permissions = all
dita.metadata.default.publisher = Qt Project dita.metadata.default.publisher = Qt Project
dita.metadata.default.copyryear = 2019 dita.metadata.default.copyryear = 2020
dita.metadata.default.copyrholder = The Qt Company Ltd dita.metadata.default.copyrholder = The Qt Company Ltd
dita.metadata.default.audience = programmer dita.metadata.default.audience = programmer

View File

@ -78,7 +78,7 @@ HTML.footer += \
" <ul id=\"menu-footer-submenu\" class=\"right clearfix\"><li id=\"menu-item-1795\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1795\"><a title=\"Sign into your account.\" href=\"https://account.qt.io/login\">Sign In</a></li>\n" \ " <ul id=\"menu-footer-submenu\" class=\"right clearfix\"><li id=\"menu-item-1795\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1795\"><a title=\"Sign into your account.\" href=\"https://account.qt.io/login\">Sign In</a></li>\n" \
" <li id=\"menu-item-10375\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-10375\"><a href=\"mailto:feedback@theqtcompany.com?Subject=Feedback%20about%20doc.qt.io%20site\">Feedback</a></li>\n" \ " <li id=\"menu-item-10375\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-10375\"><a href=\"mailto:feedback@theqtcompany.com?Subject=Feedback%20about%20doc.qt.io%20site\">Feedback</a></li>\n" \
" <li id=\"menu-item-1494\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1494\"><a href=\"http://qt.io/contact-us/\">Contact us</a></li>\n" \ " <li id=\"menu-item-1494\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1494\"><a href=\"http://qt.io/contact-us/\">Contact us</a></li>\n" \
" <li id=\"menu-item-4472\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-4472\"><a href=\"http://qt.io/about-us/\">© 2019 The Qt Company</a></li>\n" \ " <li id=\"menu-item-4472\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-4472\"><a href=\"http://qt.io/about-us/\">© 2020 The Qt Company</a></li>\n" \
" </ul>\n" \ " </ul>\n" \
"</div>\n" \ "</div>\n" \
"</div>\n" \ "</div>\n" \

View File

@ -8,7 +8,7 @@ HTML.footer = \
"</div>\n" \ "</div>\n" \
"<div class=\"footer\">\n" \ "<div class=\"footer\">\n" \
" <p>\n" \ " <p>\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2019 The Qt Company Ltd.\n" \ " <acronym title=\"Copyright\">&copy;</acronym> 2020 The Qt Company Ltd.\n" \
" Documentation contributions included herein are the copyrights of\n" \ " Documentation contributions included herein are the copyrights of\n" \
" their respective owners.<br/>" \ " their respective owners.<br/>" \
" The documentation provided herein is licensed under the terms of the" \ " The documentation provided herein is licensed under the terms of the" \

View File

@ -5,7 +5,7 @@
HTML.footer = \ HTML.footer = \
" </div>\n" \ " </div>\n" \
" <p class=\"copy-notice\">\n" \ " <p class=\"copy-notice\">\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2019 The Qt Company Ltd.\n" \ " <acronym title=\"Copyright\">&copy;</acronym> 2020 The Qt Company Ltd.\n" \
" Documentation contributions included herein are the copyrights of\n" \ " Documentation contributions included herein are the copyrights of\n" \
" their respective owners. " \ " their respective owners. " \
" The documentation provided herein is licensed under the terms of the" \ " The documentation provided herein is licensed under the terms of the" \

View File

@ -238,8 +238,7 @@
\snippet threads/mandelbrot/mandelbrotwidget.cpp 1 \snippet threads/mandelbrot/mandelbrotwidget.cpp 1
The interesting part of the constructor is the The interesting part of the constructor is the
qRegisterMetaType() and QObject::connect() calls. Let's start QObject::connect() call.
with the \l{QObject::connect()}{connect()} call.
Although it looks like a standard signal-slot connection between Although it looks like a standard signal-slot connection between
two \l{QObject}s, because the signal is emitted in a different two \l{QObject}s, because the signal is emitted in a different
@ -254,9 +253,10 @@
With queued connections, Qt must store a copy of the arguments With queued connections, Qt must store a copy of the arguments
that were passed to the signal so that it can pass them to the that were passed to the signal so that it can pass them to the
slot later on. Qt knows how to take of copy of many C++ and Qt slot later on. Qt knows how to take of copy of many C++ and Qt
types, but QImage isn't one of them. We must therefore call the types, so, no further action is needed for QImage.
template function qRegisterMetaType() before we can use QImage If a custom type was used, a call to the template function
as a parameter in queued connections. qRegisterMetaType() would be required before the type
could be used as a parameter in queued connections.
\snippet threads/mandelbrot/mandelbrotwidget.cpp 2 \snippet threads/mandelbrot/mandelbrotwidget.cpp 2
\snippet threads/mandelbrot/mandelbrotwidget.cpp 3 \snippet threads/mandelbrot/mandelbrotwidget.cpp 3

View File

@ -182,6 +182,6 @@
In addition to the functions and slots discussed above, we have In addition to the functions and slots discussed above, we have
also implemented several convenience functions to simplify the also implemented several convenience functions to simplify the
constructor: \c createIconGroupBox(), \c createMessageGroupBox(), constructor: \c createIconGroupBox(), \c createMessageGroupBox(),
\c createActions() and \c createTrayIcon(). See the \l \c createActions() and \c createTrayIcon(). See the \c
{desktop/systray/window.cpp}{window.cpp} file for details. {desktop/systray/window.cpp} file for details.
*/ */

View File

@ -136,7 +136,7 @@
\section1 Defining the AddressBook Class \section1 Defining the AddressBook Class
The \l{tutorials/addressbook/part1/addressbook.h}{\c addressbook.h} file is The \c{tutorials/addressbook/part1/addressbook.h} file is
used to define the \c AddressBook class. used to define the \c AddressBook class.
We start by defining \c AddressBook as a QWidget subclass and declaring We start by defining \c AddressBook as a QWidget subclass and declaring

View File

@ -284,6 +284,6 @@
instance of the QStandardItemModel class, i.e., a generic model instance of the QStandardItemModel class, i.e., a generic model
for storing custom data typically used as a repository for for storing custom data typically used as a repository for
standard Qt data types. Each mail description is added to the standard Qt data types. Each mail description is added to the
model using \c addMail(), another convenience function. See \l model using \c addMail(), another convenience function. See \c
{itemviews/customsortfiltermodel/main.cpp}{main.cpp} for details. {itemviews/customsortfiltermodel/main.cpp} for details.
*/ */

View File

@ -320,8 +320,8 @@
The \c setupShapes() function is called from the constructor and The \c setupShapes() function is called from the constructor and
create the QPainterPath objects representing the shapes that are create the QPainterPath objects representing the shapes that are
used in the application. For construction details, see the \l used in the application. For construction details, see the \c
{painting/transformations/window.cpp}{window.cpp} example {painting/transformations/window.cpp} example
file. The shapes are stored in a QList. The QList::append() file. The shapes are stored in a QList. The QList::append()
function inserts the given shape at the end of the list. function inserts the given shape at the end of the list.

View File

@ -36,7 +36,8 @@ build_pass {
} }
} }
} else: contains(TEMPLATE, "lib"):!static:!QTDIR_build:android_install { } else: contains(TEMPLATE, "lib"):!static:!QTDIR_build:android_install {
!contains(TARGET, "_$${QT_ARCH}"): TARGET = $${TARGET}_$${QT_ARCH} tmpvar = $$str_member(TARGET, -$$str_size(QT_ARCH), -1)
!equals(tmpvar, $${QT_ARCH}): TARGET = $${TARGET}_$${QT_ARCH}
target.path = /libs/$$ANDROID_TARGET_ARCH/ target.path = /libs/$$ANDROID_TARGET_ARCH/
INSTALLS *= target INSTALLS *= target
} }

View File

@ -212,14 +212,17 @@ macx-xcode {
QMAKE_CXXFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS) QMAKE_CXXFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
QMAKE_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS) QMAKE_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS)
} else { } else {
simulator: \ simulator {
version_identifier = $$simulator.deployment_identifier version_identifier = $$simulator.deployment_identifier
else: \ sysroot_path = $$xcodeSDKInfo(Path, $$simulator.sdk)
} else {
version_identifier = $$device.deployment_identifier version_identifier = $$device.deployment_identifier
sysroot_path = $$xcodeSDKInfo(Path, $$device.sdk)
}
version_min_flag = -m$${version_identifier}-version-min=$$deployment_target version_min_flag = -m$${version_identifier}-version-min=$$deployment_target
QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag QMAKE_CFLAGS += -isysroot $$sysroot_path $$version_min_flag
QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag QMAKE_CXXFLAGS += -isysroot $$sysroot_path $$version_min_flag
QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH $$version_min_flag QMAKE_LFLAGS += -Wl,-syslibroot,$$sysroot_path $$version_min_flag
} }
# Enable precompiled headers for multiple architectures # Enable precompiled headers for multiple architectures

View File

@ -1,4 +1,4 @@
QMAKE_TARGET_COMPANY = The Qt Company Ltd. QMAKE_TARGET_COMPANY = The Qt Company Ltd.
isEmpty(QMAKE_TARGET_PRODUCT): QMAKE_TARGET_PRODUCT = Qt5 isEmpty(QMAKE_TARGET_PRODUCT): QMAKE_TARGET_PRODUCT = Qt5
isEmpty(QMAKE_TARGET_DESCRIPTION): QMAKE_TARGET_DESCRIPTION = C++ Application Development Framework isEmpty(QMAKE_TARGET_DESCRIPTION): QMAKE_TARGET_DESCRIPTION = C++ Application Development Framework
QMAKE_TARGET_COPYRIGHT = Copyright (C) 2019 The Qt Company Ltd. QMAKE_TARGET_COPYRIGHT = Copyright (C) 2020 The Qt Company Ltd.

View File

@ -303,7 +303,9 @@ SUBDIRS = kernel \
#! [51] #! [51]
CONFIG += ordered SUBDIRS += my_executable my_library tests doc
my_executable.depends = my_library
tests.depends = my_executable
#! [51] #! [51]

View File

@ -40,3 +40,21 @@ win32|macx {
HEADERS += debugging.h HEADERS += debugging.h
} }
#! [4] #! [4]
#! [5]
if(win32|macos):CONFIG(debug, debug|release) {
# Do something on Windows and macOS,
# but only for the debug configuration.
}
win32|if(macos:CONFIG(debug, debug|release)) {
# Do something on Windows (regardless of debug or release)
# and on macOS (only for debug).
}
#! [5]
#! [6]
win32-* {
# Matches every mkspec starting with "win32-"
SOURCES += win32_specific.cpp
}
#! [6]

View File

@ -936,7 +936,9 @@
file. file.
\row \li ordered \li When using the \c subdirs template, this option \row \li ordered \li When using the \c subdirs template, this option
specifies that the directories listed should be processed in the specifies that the directories listed should be processed in the
order in which they are given. order in which they are given. \note The use of this option is discouraged.
Specify dependencies as described in the \l{#SUBDIRS}{SUBDIRS}
variable documentation.
\row \li precompile_header \li Enables support for the use of \row \li precompile_header \li Enables support for the use of
\l{Using Precompiled Headers}{precompiled headers} in projects. \l{Using Precompiled Headers}{precompiled headers} in projects.
\row \li precompile_header_c (MSVC only) \li Enables support for the use of \row \li precompile_header_c (MSVC only) \li Enables support for the use of
@ -2730,21 +2732,35 @@
\snippet code/doc_src_qmake-manual.pro 50 \snippet code/doc_src_qmake-manual.pro 50
If you need to ensure that the subdirectories are built in the order in If you need to ensure that the subdirectories are built in a particular
which they are specified, update the \l{#CONFIG}{CONFIG} variable to order, use the \c .depends modifier on the relevant \c SUBDIRS elements.
include the \c ordered option:
For example:
\snippet code/doc_src_qmake-manual.pro 51 \snippet code/doc_src_qmake-manual.pro 51
It is possible to modify this default behavior of \c SUBDIRS by giving The configuration above ensures that \c{my_library} is built before
additional modifiers to \c SUBDIRS elements. Supported modifiers are: \c{my_executable} and that \c{my_executable} is built before \c{tests}.
However, \c{doc} can be built in parallel with the other subdirectories,
thus speeding up the build process.
\note Multiple dependencies can be listed and they will all be built before
the target that depends on them.
\note Using \l{#CONFIG}{CONFIG += ordered} is discouraged as it can slow down
multi-core builds. Unlike the example shown above, all builds will happen
sequentially even if they don't have dependencies.
Beside defining the build order, it is possible to modify the default behavior
of \c SUBDIRS by giving additional modifiers to \c SUBDIRS elements.
Supported modifiers are:
\table \table
\header \li Modifier \li Effect \header \li Modifier \li Effect
\row \li .subdir \li Use the specified subdirectory instead of \c SUBDIRS value. \row \li .subdir \li Use the specified subdirectory instead of \c SUBDIRS value.
\row \li .file \li Specify the subproject \c pro file explicitly. Cannot be \row \li .file \li Specify the subproject \c pro file explicitly. Cannot be
used in conjunction with \c .subdir modifier. used in conjunction with \c .subdir modifier.
\row \li .depends \li This subproject depends on specified subproject. \row \li .depends \li This subproject depends on specified subproject(s).
\row \li .makefile \li The makefile of subproject. \row \li .makefile \li The makefile of subproject.
Available only on platforms that use makefiles. Available only on platforms that use makefiles.
\row \li .target \li Base string used for makefile targets related to this \row \li .target \li Base string used for makefile targets related to this
@ -4418,6 +4434,20 @@
\snippet qmake/scopes.pro 4 \snippet qmake/scopes.pro 4
If you need to mix both operators, you can use the \c if function to specify
operator precedence.
\snippet qmake/scopes.pro 5
The condition accepts the wildcard character to match a family of \c{CONFIG}
values or mkspec names.
\snippet qmake/scopes.pro 6
\note Historically, checking the mkspec name with wildcards like above was
qmake's way to check for the platform. Nowadays, we recommend to use values
that are defined by the mkspec in the \c QMAKE_PLATFORM variable.
You can also provide alternative declarations to those within a scope by You can also provide alternative declarations to those within a scope by
using an \c else scope. Each \c else scope is processed if the conditions using an \c else scope. Each \c else scope is processed if the conditions
for the preceding scopes are false. for the preceding scopes are false.

View File

@ -1520,7 +1520,7 @@ MakefileGenerator::createObjectList(const ProStringList &sources)
if (!noIO()) { if (!noIO()) {
// Ensure that the final output directory of each object exists // Ensure that the final output directory of each object exists
QString outRelativePath = fileFixify(dir, FileFixifyBackwards); QString outRelativePath = fileFixify(dir, FileFixifyBackwards);
if (!mkdir(outRelativePath)) if (!outRelativePath.isEmpty() && !mkdir(outRelativePath))
warn_msg(WarnLogic, "Cannot create directory '%s'", outRelativePath.toLatin1().constData()); warn_msg(WarnLogic, "Cannot create directory '%s'", outRelativePath.toLatin1().constData());
} }
} else { } else {

View File

@ -132,23 +132,6 @@ public class QtActivityLoader extends QtLoader {
return; return;
} }
if (Build.VERSION.SDK_INT < 21) {
// fatal error, show the error and quit
AlertDialog errorDialog = new AlertDialog.Builder(m_activity).create();
if (m_contextInfo.metaData.containsKey("android.app.unsupported_android_version"))
errorDialog.setMessage(m_contextInfo.metaData.getString("android.app.unsupported_android_version"));
else
errorDialog.setMessage("Unsupported Android version.");
errorDialog.setButton(m_activity.getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
errorDialog.show();
return;
}
try { try {
m_activity.setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null)); m_activity.setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
} catch (Exception e) { } catch (Exception e) {

View File

@ -71,7 +71,7 @@ QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj // timer == (QObject *)obj
QAbstractButton *button = qobject_cast<QAbstractButton *>(obj); QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == 0 // button == nullptr
//! [3] //! [3]
@ -144,7 +144,7 @@ class MyObject : public QObject
Q_OBJECT Q_OBJECT
public: public:
MyObject(QObject *parent = 0); MyObject(QObject *parent = nullptr);
protected: protected:
void timerEvent(QTimerEvent *event) override; void timerEvent(QTimerEvent *event) override;
@ -322,7 +322,7 @@ QObject::connect: Cannot queue arguments of type 'MyType'
//! [26] //! [26]
disconnect(myObject, 0, 0, 0); disconnect(myObject, nullptr, nullptr, nullptr);
//! [26] //! [26]
@ -332,7 +332,7 @@ myObject->disconnect();
//! [28] //! [28]
disconnect(myObject, SIGNAL(mySignal()), 0, 0); disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);
//! [28] //! [28]
@ -342,7 +342,7 @@ myObject->disconnect(SIGNAL(mySignal()));
//! [30] //! [30]
disconnect(myObject, 0, myReceiver, 0); disconnect(myObject, nullptr, myReceiver, nullptr);
//! [30] //! [30]
@ -391,7 +391,7 @@ class MyClass : public QObject
Q_OBJECT Q_OBJECT
public: public:
MyClass(QObject *parent = 0); MyClass(QObject *parent = nullptr);
~MyClass(); ~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow }; enum Priority { High, Low, VeryHigh, VeryLow };
@ -467,7 +467,7 @@ QObject::connect(socket, &QTcpSocket::connected, [=] () {
//! [46] //! [46]
//! [47] //! [47]
disconnect(myObject, &MyObject::mySignal(), 0, 0); disconnect(myObject, &MyObject::mySignal(), nullptr, nullptr);
//! [47] //! [47]
//! [48] //! [48]
@ -505,7 +505,7 @@ class MyClass : public QWidget
Q_OBJECT Q_OBJECT
public: public:
MyClass(QWidget *parent = 0); MyClass(QWidget *parent = nullptr);
~MyClass(); ~MyClass();
bool event(QEvent* ev) override bool event(QEvent* ev) override

View File

@ -37,5 +37,5 @@
QCborValueRef qfloat16 QDeferredDeleteEvent QSpecialInteger QLittleEndianStorageType QCborValueRef qfloat16 QDeferredDeleteEvent QSpecialInteger QLittleEndianStorageType
QBigEndianStorageType QFactoryInterface QFutureWatcherBase QJsonValuePtr QBigEndianStorageType QFactoryInterface QFutureWatcherBase QJsonValuePtr
QJsonValueRefPtr QLinkedListNode QAbstractConcatenable QStringBuilderCommon QJsonValueRefPtr QLinkedListNode QAbstractConcatenable QStringBuilderCommon
QTextCodec::ConverterState QThreadStorageData) QTextCodec::ConverterState QThreadStorageData QTextStreamManipulator)
*/ */

View File

@ -883,7 +883,6 @@
# define Q_COMPILER_DEFAULT_MEMBERS # define Q_COMPILER_DEFAULT_MEMBERS
# define Q_COMPILER_DELETE_MEMBERS # define Q_COMPILER_DELETE_MEMBERS
/* C++11 features supported in GCC 4.6: */ /* C++11 features supported in GCC 4.6: */
# define Q_COMPILER_CONSTEXPR
# define Q_COMPILER_NULLPTR # define Q_COMPILER_NULLPTR
# define Q_COMPILER_UNRESTRICTED_UNIONS # define Q_COMPILER_UNRESTRICTED_UNIONS
# define Q_COMPILER_RANGE_FOR # define Q_COMPILER_RANGE_FOR
@ -914,7 +913,11 @@
# define Q_COMPILER_REF_QUALIFIERS # define Q_COMPILER_REF_QUALIFIERS
# endif # endif
# endif # endif
/* C++11 features are complete as of GCC 4.8.1 */ # if Q_CC_GNU >= 500
/* GCC 4.6 introduces constexpr, but it's bugged (at least) in the whole
* 4.x series, see e.g. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 */
# define Q_COMPILER_CONSTEXPR
# endif
# endif # endif
# if __cplusplus > 201103L # if __cplusplus > 201103L
# if Q_CC_GNU >= 409 # if Q_CC_GNU >= 409

View File

@ -945,7 +945,7 @@ QT_WARNING_POP
#endif #endif
QT_WARNING_PUSH QT_WARNING_PUSH
// warning: noexcept-expression evaluates to false because of a call to void swap(..., ...)' // warning: noexcept-expression evaluates to 'false' because of a call to 'void swap(..., ...)'
QT_WARNING_DISABLE_GCC("-Wnoexcept") QT_WARNING_DISABLE_GCC("-Wnoexcept")
namespace QtPrivate namespace QtPrivate

View File

@ -249,7 +249,8 @@ QT_WARNING_POP
// size_t. Implementations for 8- and 16-bit types will work but may not be as // size_t. Implementations for 8- and 16-bit types will work but may not be as
// efficient. Implementations for 64-bit may be missing on 32-bit platforms. // efficient. Implementations for 64-bit may be missing on 32-bit platforms.
#if (defined(Q_CC_GNU) && (Q_CC_GNU >= 500) || (defined(Q_CC_INTEL) && !defined(Q_OS_WIN))) || __has_builtin(__builtin_add_overflow) #if ((defined(Q_CC_INTEL) ? (Q_CC_INTEL >= 1800 && !defined(Q_OS_WIN)) : defined(Q_CC_GNU)) \
&& Q_CC_GNU >= 500) || __has_builtin(__builtin_add_overflow)
// GCC 5, ICC 18, and Clang 3.8 have builtins to detect overflows // GCC 5, ICC 18, and Clang 3.8 have builtins to detect overflows
template <typename T> inline template <typename T> inline

View File

@ -403,6 +403,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
const QString absolutePath = isDir ? fileInfo.absoluteFilePath() : fileInfo.absolutePath(); const QString absolutePath = isDir ? fileInfo.absoluteFilePath() : fileInfo.absolutePath();
const uint flags = isDir const uint flags = isDir
? (FILE_NOTIFY_CHANGE_DIR_NAME ? (FILE_NOTIFY_CHANGE_DIR_NAME
| FILE_NOTIFY_CHANGE_ATTRIBUTES
| FILE_NOTIFY_CHANGE_FILE_NAME) | FILE_NOTIFY_CHANGE_FILE_NAME)
: (FILE_NOTIFY_CHANGE_DIR_NAME : (FILE_NOTIFY_CHANGE_DIR_NAME
| FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_FILE_NAME

View File

@ -1004,7 +1004,7 @@ QT_WARNING_POP
/*! /*!
\internal \internal
Returns true if we emitted readyRead(). Returns \c true if we emitted readyRead().
*/ */
bool QProcessPrivate::tryReadFromChannel(Channel *channel) bool QProcessPrivate::tryReadFromChannel(Channel *channel)
{ {
@ -2187,6 +2187,8 @@ bool QProcess::startDetached(qint64 *pid)
This method is an alias for start(), and exists only to fully implement This method is an alias for start(), and exists only to fully implement
the interface defined by QIODevice. the interface defined by QIODevice.
Returns \c true if the program has been started.
\sa start(), setProgram(), setArguments() \sa start(), setProgram(), setArguments()
*/ */
bool QProcess::open(OpenMode mode) bool QProcess::open(OpenMode mode)

View File

@ -212,6 +212,7 @@ Qt::ItemFlags QStringListModel::flags(const QModelIndex &index) const
\a index in the model, to the provided \a value. \a index in the model, to the provided \a value.
The dataChanged() signal is emitted if the item is changed. The dataChanged() signal is emitted if the item is changed.
Returns \c true after emitting the dataChanged() signal.
\sa Qt::ItemDataRole, data() \sa Qt::ItemDataRole, data()
*/ */
@ -249,6 +250,8 @@ bool QStringListModel::clearItemData(const QModelIndex &index)
specified, indicating that the rows are inserted in the top level of specified, indicating that the rows are inserted in the top level of
the model. the model.
Returns \c true if the insertion was successful.
\sa QAbstractItemModel::insertRows() \sa QAbstractItemModel::insertRows()
*/ */
@ -275,6 +278,8 @@ bool QStringListModel::insertRows(int row, int count, const QModelIndex &parent)
specified, indicating that the rows are removed in the top level of specified, indicating that the rows are removed in the top level of
the model. the model.
Returns \c true if the row removal was successful.
\sa QAbstractItemModel::removeRows() \sa QAbstractItemModel::removeRows()
*/ */

View File

@ -118,7 +118,7 @@ public:
int remainingTime(int timerId) final; int remainingTime(int timerId) final;
void wakeUp() final; void wakeUp() override;
void interrupt() final; void interrupt() final;
void flush() override; void flush() override;

View File

@ -1185,8 +1185,8 @@ QObjectPrivate::Connection::~Connection()
\relates QObject \relates QObject
Returns the given \a object cast to type T if the object is of type Returns the given \a object cast to type T if the object is of type
T (or of a subclass); otherwise returns 0. If \a object is 0 then T (or of a subclass); otherwise returns \nullptr. If \a object is
it will also return 0. \nullptr then it will also return \nullptr.
The class T must inherit (directly or indirectly) QObject and be The class T must inherit (directly or indirectly) QObject and be
declared with the \l Q_OBJECT macro. declared with the \l Q_OBJECT macro.
@ -1538,7 +1538,7 @@ QThread *QObject::thread() const
the thread affinity is changed. You can handle this event to the thread affinity is changed. You can handle this event to
perform any special processing. Note that any new events that are perform any special processing. Note that any new events that are
posted to this object will be handled in the \a targetThread, posted to this object will be handled in the \a targetThread,
provided it is non-null: when it is \nullptr, no event processing provided it is not \nullptr: when it is \nullptr, no event processing
for this object or its children can happen, as they are no longer for this object or its children can happen, as they are no longer
associated with any thread. associated with any thread.
@ -2335,7 +2335,7 @@ void QObject::deleteLater()
If the same \a sourceText is used in different roles within the If the same \a sourceText is used in different roles within the
same context, an additional identifying string may be passed in same context, an additional identifying string may be passed in
\a disambiguation (0 by default). In Qt 4.4 and earlier, this was \a disambiguation (\nullptr by default). In Qt 4.4 and earlier, this was
the preferred way to pass comments to translators. the preferred way to pass comments to translators.
Example: Example:
@ -2521,7 +2521,7 @@ QObject *QObject::sender() const
For signals with default parameters, this function will always return For signals with default parameters, this function will always return
the index with all parameters, regardless of which was used with the index with all parameters, regardless of which was used with
connect(). For example, the signal \c {destroyed(QObject *obj = 0)} connect(). For example, the signal \c {destroyed(QObject *obj = \nullptr)}
will have two different indexes (with and without the parameter), but will have two different indexes (with and without the parameter), but
this function will always return the index with a parameter. This does this function will always return the index with a parameter. This does
not apply when overloading signals with different parameters. not apply when overloading signals with different parameters.
@ -2662,7 +2662,7 @@ bool QObject::isSignalConnected(const QMetaMethod &signal) const
member in the specified class. member in the specified class.
\list \list
\li If member.mobj is 0 then both signalIndex and methodIndex are set to -1. \li If member.mobj is \nullptr then both signalIndex and methodIndex are set to -1.
\li If specified member is not a member of obj instance class (or one of \li If specified member is not a member of obj instance class (or one of
its parent classes) then both signalIndex and methodIndex are set to -1. its parent classes) then both signalIndex and methodIndex are set to -1.
@ -2799,12 +2799,12 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
const QObject *receiver, const char *method, const QObject *receiver, const char *method,
Qt::ConnectionType type) Qt::ConnectionType type)
{ {
if (sender == 0 || receiver == 0 || signal == 0 || method == 0) { if (sender == nullptr || receiver == nullptr || signal == nullptr || method == nullptr) {
qWarning("QObject::connect: Cannot connect %s::%s to %s::%s", qWarning("QObject::connect: Cannot connect %s::%s to %s::%s",
sender ? sender->metaObject()->className() : "(null)", sender ? sender->metaObject()->className() : "(nullptr)",
(signal && *signal) ? signal+1 : "(null)", (signal && *signal) ? signal+1 : "(nullptr)",
receiver ? receiver->metaObject()->className() : "(null)", receiver ? receiver->metaObject()->className() : "(nullptr)",
(method && *method) ? method+1 : "(null)"); (method && *method) ? method+1 : "(nullptr)");
return QMetaObject::Connection(0); return QMetaObject::Connection(0);
} }
QByteArray tmp_signal_name; QByteArray tmp_signal_name;
@ -2937,14 +2937,14 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
const QObject *receiver, const QMetaMethod &method, const QObject *receiver, const QMetaMethod &method,
Qt::ConnectionType type) Qt::ConnectionType type)
{ {
if (sender == 0 if (sender == nullptr
|| receiver == 0 || receiver == nullptr
|| signal.methodType() != QMetaMethod::Signal || signal.methodType() != QMetaMethod::Signal
|| method.methodType() == QMetaMethod::Constructor) { || method.methodType() == QMetaMethod::Constructor) {
qWarning("QObject::connect: Cannot connect %s::%s to %s::%s", qWarning("QObject::connect: Cannot connect %s::%s to %s::%s",
sender ? sender->metaObject()->className() : "(null)", sender ? sender->metaObject()->className() : "(nullptr)",
signal.methodSignature().constData(), signal.methodSignature().constData(),
receiver ? receiver->metaObject()->className() : "(null)", receiver ? receiver->metaObject()->className() : "(nullptr)",
method.methodSignature().constData() ); method.methodSignature().constData() );
return QMetaObject::Connection(0); return QMetaObject::Connection(0);
} }
@ -3046,20 +3046,20 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
\endlist \endlist
0 may be used as a wildcard, meaning "any signal", "any receiving \nullptr may be used as a wildcard, meaning "any signal", "any receiving
object", or "any slot in the receiving object", respectively. object", or "any slot in the receiving object", respectively.
The \a sender may never be \nullptr. (You cannot disconnect signals The \a sender may never be \nullptr. (You cannot disconnect signals
from more than one object in a single call.) from more than one object in a single call.)
If \a signal is 0, it disconnects \a receiver and \a method from If \a signal is \nullptr, it disconnects \a receiver and \a method from
any signal. If not, only the specified signal is disconnected. any signal. If not, only the specified signal is disconnected.
If \a receiver is 0, it disconnects anything connected to \a If \a receiver is \nullptr, it disconnects anything connected to \a
signal. If not, slots in objects other than \a receiver are not signal. If not, slots in objects other than \a receiver are not
disconnected. disconnected.
If \a method is 0, it disconnects anything that is connected to \a If \a method is \nullptr, it disconnects anything that is connected to \a
receiver. If not, only slots named \a method will be disconnected, receiver. If not, only slots named \a method will be disconnected,
and all other slots are left alone. The \a method must be \nullptr and all other slots are left alone. The \a method must be \nullptr
if \a receiver is left out, so you cannot disconnect a if \a receiver is left out, so you cannot disconnect a
@ -3070,8 +3070,8 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
bool QObject::disconnect(const QObject *sender, const char *signal, bool QObject::disconnect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method) const QObject *receiver, const char *method)
{ {
if (sender == 0 || (receiver == 0 && method != 0)) { if (sender == nullptr || (receiver == nullptr && method != nullptr)) {
qWarning("QObject::disconnect: Unexpected null parameter"); qWarning("QObject::disconnect: Unexpected nullptr parameter");
return false; return false;
} }
@ -3197,16 +3197,16 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
\endlist \endlist
QMetaMethod() may be used as wildcard in the meaning "any signal" or "any slot in receiving object". QMetaMethod() may be used as wildcard in the meaning "any signal" or "any slot in receiving object".
In the same way 0 can be used for \a receiver in the meaning "any receiving object". In this case In the same way \nullptr can be used for \a receiver in the meaning "any receiving object".
method should also be QMetaMethod(). \a sender parameter should be never 0. In this case method should also be QMetaMethod(). \a sender parameter should be never \nullptr.
\sa disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) \sa disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
*/ */
bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
const QObject *receiver, const QMetaMethod &method) const QObject *receiver, const QMetaMethod &method)
{ {
if (sender == 0 || (receiver == 0 && method.mobj != 0)) { if (sender == nullptr || (receiver == nullptr && method.mobj != nullptr)) {
qWarning("QObject::disconnect: Unexpected null parameter"); qWarning("QObject::disconnect: Unexpected nullptr parameter");
return false; return false;
} }
if (signal.mobj) { if (signal.mobj) {
@ -3240,7 +3240,7 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy);
QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index);
} }
// If we are here sender is not null. If signal is not null while signal_index // If we are here sender is not nullptr. If signal is not nullptr while signal_index
// is -1 then this signal is not a member of sender. // is -1 then this signal is not a member of sender.
if (signal.mobj && signal_index == -1) { if (signal.mobj && signal_index == -1) {
qWarning("QObject::disconect: signal %s not found on class %s", qWarning("QObject::disconect: signal %s not found on class %s",
@ -3329,7 +3329,7 @@ void QObject::connectNotify(const QMetaMethod &signal)
\a signal with a specific signal. \a signal with a specific signal.
If all signals were disconnected from this object (e.g., the If all signals were disconnected from this object (e.g., the
signal argument to disconnect() was 0), disconnectNotify() signal argument to disconnect() was \nullptr), disconnectNotify()
is only called once, and the \a signal will be an invalid is only called once, and the \a signal will be an invalid
QMetaMethod (QMetaMethod::isValid() returns \c false). QMetaMethod (QMetaMethod::isValid() returns \c false).
@ -4929,7 +4929,7 @@ void qDeleteInEventHandler(QObject *o)
\a sender is the sender object \a sender is the sender object
\a signal is a pointer to a pointer to a member signal of the sender \a signal is a pointer to a pointer to a member signal of the sender
\a receiver is the receiver object, may not be null, will be equal to sender when \a receiver is the receiver object, may not be \nullptr, will be equal to sender when
connecting to a static function or a functor connecting to a static function or a functor
\a slot a pointer only used when using Qt::UniqueConnection \a slot a pointer only used when using Qt::UniqueConnection
\a type the Qt::ConnctionType passed as argument to connect \a type the Qt::ConnctionType passed as argument to connect
@ -4937,7 +4937,7 @@ void qDeleteInEventHandler(QObject *o)
to be used with queued connection to be used with queued connection
must stay valid at least for the whole time of the connection, this function must stay valid at least for the whole time of the connection, this function
do not take ownership. typically static data. do not take ownership. typically static data.
If null, then the types will be computed when the signal is emit in a queued If \nullptr, then the types will be computed when the signal is emit in a queued
connection from the types from the signature. connection from the types from the signature.
\a senderMetaObject is the metaobject used to lookup the signal, the signal must be in \a senderMetaObject is the metaobject used to lookup the signal, the signal must be in
this metaobject this metaobject
@ -4948,7 +4948,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
const int *types, const QMetaObject *senderMetaObject) const int *types, const QMetaObject *senderMetaObject)
{ {
if (!signal) { if (!signal) {
qWarning("QObject::connect: invalid null parameter"); qWarning("QObject::connect: invalid nullptr parameter");
if (slotObj) if (slotObj)
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(); return QMetaObject::Connection();
@ -4988,7 +4988,7 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s
: "Unknown"; : "Unknown";
const char *receiverString = receiver ? receiver->metaObject()->className() const char *receiverString = receiver ? receiver->metaObject()->className()
: "Unknown"; : "Unknown";
qWarning("QObject::connect(%s, %s): invalid null parameter", senderString, receiverString); qWarning("QObject::connect(%s, %s): invalid nullptr parameter", senderString, receiverString);
if (slotObj) if (slotObj)
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(); return QMetaObject::Connection();
@ -5121,20 +5121,20 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
\endlist \endlist
0 may be used as a wildcard, meaning "any signal", "any receiving \nullptr may be used as a wildcard, meaning "any signal", "any receiving
object", or "any slot in the receiving object", respectively. object", or "any slot in the receiving object", respectively.
The \a sender may never be \nullptr. (You cannot disconnect signals The \a sender may never be \nullptr. (You cannot disconnect signals
from more than one object in a single call.) from more than one object in a single call.)
If \a signal is 0, it disconnects \a receiver and \a method from If \a signal is \nullptr, it disconnects \a receiver and \a method from
any signal. If not, only the specified signal is disconnected. any signal. If not, only the specified signal is disconnected.
If \a receiver is 0, it disconnects anything connected to \a If \a receiver is \nullptr, it disconnects anything connected to \a
signal. If not, slots in objects other than \a receiver are not signal. If not, slots in objects other than \a receiver are not
disconnected. disconnected.
If \a method is 0, it disconnects anything that is connected to \a If \a method is \nullptr, it disconnects anything that is connected to \a
receiver. If not, only slots named \a method will be disconnected, receiver. If not, only slots named \a method will be disconnected,
and all other slots are left alone. The \a method must be \nullptr and all other slots are left alone. The \a method must be \nullptr
if \a receiver is left out, so you cannot disconnect a if \a receiver is left out, so you cannot disconnect a
@ -5150,8 +5150,8 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, const QMetaObject *senderMetaObject) bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, const QMetaObject *senderMetaObject)
{ {
if (sender == 0 || (receiver == 0 && slot != 0)) { if (sender == nullptr || (receiver == nullptr && slot != nullptr)) {
qWarning("QObject::disconnect: Unexpected null parameter"); qWarning("QObject::disconnect: Unexpected nullptr parameter");
return false; return false;
} }
@ -5182,7 +5182,7 @@ bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject
QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type) QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type)
{ {
if (!sender) { if (!sender) {
qWarning("QObject::connect: invalid null parameter"); qWarning("QObject::connect: invalid nullptr parameter");
if (slotObj) if (slotObj)
slotObj->destroyIfLastRef(); slotObj->destroyIfLastRef();
return QMetaObject::Connection(); return QMetaObject::Connection();

View File

@ -320,9 +320,9 @@ private:
return Type(quint8(st) | SimpleType); return Type(quint8(st) | SimpleType);
} }
Q_DECL_CONSTEXPR static bool isTag_helper(Type t) Q_DECL_CONSTEXPR static bool isTag_helper(Type tt)
{ {
return t == Tag || t >= 0x10000; return tt == Tag || tt >= 0x10000;
} }
}; };
Q_DECLARE_SHARED(QCborValue) Q_DECLARE_SHARED(QCborValue)

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2019 Intel Corporation. ** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
@ -651,7 +651,6 @@ int qt_repeatCount(QStringView s)
} }
static const QLocaleData *default_data = nullptr; static const QLocaleData *default_data = nullptr;
static QLocale::NumberOptions default_number_options = QLocale::DefaultNumberOptions;
static const QLocaleData *const c_data = locale_data; static const QLocaleData *const c_data = locale_data;
static QLocalePrivate *c_private() static QLocalePrivate *c_private()
@ -834,7 +833,7 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1; static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1;
Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate, Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
(QLocalePrivate::create(defaultData(), default_number_options))) (QLocalePrivate::create(defaultData())))
Q_GLOBAL_STATIC_WITH_ARGS(QExplicitlySharedDataPointer<QLocalePrivate>, systemLocalePrivate, Q_GLOBAL_STATIC_WITH_ARGS(QExplicitlySharedDataPointer<QLocalePrivate>, systemLocalePrivate,
(QLocalePrivate::create(systemData()))) (QLocalePrivate::create(systemData())))
@ -862,8 +861,9 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions; QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
// If not found, should default to system // If not found, should default to system
if (data->m_language_id == QLocale::C && language != QLocale::C) { if (data->m_language_id == QLocale::C) {
numberOptions = default_number_options; if (defaultLocalePrivate.exists())
numberOptions = defaultLocalePrivate->data()->m_numberOptions;
data = defaultData(); data = defaultData();
} }
return QLocalePrivate::create(data, offset, numberOptions); return QLocalePrivate::create(data, offset, numberOptions);
@ -1048,6 +1048,8 @@ uint qHash(const QLocale &key, uint seed) noexcept
Sets the \a options related to number conversions for this Sets the \a options related to number conversions for this
QLocale instance. QLocale instance.
\sa numberOptions()
*/ */
void QLocale::setNumberOptions(NumberOptions options) void QLocale::setNumberOptions(NumberOptions options)
{ {
@ -1060,7 +1062,10 @@ void QLocale::setNumberOptions(NumberOptions options)
Returns the options related to number conversions for this Returns the options related to number conversions for this
QLocale instance. QLocale instance.
By default, no options are set for the standard locales. By default, no options are set for the standard locales, except
for the "C" locale, which has OmitGroupSeparator set by default.
\sa setNumberOptions(), toString(), groupSeparator()
*/ */
QLocale::NumberOptions QLocale::numberOptions() const QLocale::NumberOptions QLocale::numberOptions() const
{ {
@ -1170,12 +1175,9 @@ QString QLocale::createSeparatedList(const QStringList &list) const
void QLocale::setDefault(const QLocale &locale) void QLocale::setDefault(const QLocale &locale)
{ {
default_data = locale.d->m_data; default_data = locale.d->m_data;
default_number_options = locale.numberOptions();
if (defaultLocalePrivate.exists()) { if (defaultLocalePrivate.exists()) // update the cached private
// update the cached private
*defaultLocalePrivate = locale.d; *defaultLocalePrivate = locale.d;
}
} }
/*! /*!
@ -1962,7 +1964,7 @@ double QLocale::toDouble(QStringView s, bool *ok) const
/*! /*!
Returns a localized string representation of \a i. Returns a localized string representation of \a i.
\sa toLongLong() \sa toLongLong(), numberOptions(), zeroDigit(), positiveSign()
*/ */
QString QLocale::toString(qlonglong i) const QString QLocale::toString(qlonglong i) const
@ -1978,7 +1980,7 @@ QString QLocale::toString(qlonglong i) const
/*! /*!
\overload \overload
\sa toULongLong() \sa toULongLong(), numberOptions(), zeroDigit(), positiveSign()
*/ */
QString QLocale::toString(qulonglong i) const QString QLocale::toString(qulonglong i) const
@ -2525,6 +2527,12 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCal
\since 4.1 \since 4.1
Returns the decimal point character of this locale. Returns the decimal point character of this locale.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa groupSeparator(), toString()
*/ */
QChar QLocale::decimalPoint() const QChar QLocale::decimalPoint() const
{ {
@ -2535,6 +2543,12 @@ QChar QLocale::decimalPoint() const
\since 4.1 \since 4.1
Returns the group separator character of this locale. Returns the group separator character of this locale.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa decimalPoint(), toString()
*/ */
QChar QLocale::groupSeparator() const QChar QLocale::groupSeparator() const
{ {
@ -2545,6 +2559,12 @@ QChar QLocale::groupSeparator() const
\since 4.1 \since 4.1
Returns the percent character of this locale. Returns the percent character of this locale.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa toString()
*/ */
QChar QLocale::percent() const QChar QLocale::percent() const
{ {
@ -2555,6 +2575,12 @@ QChar QLocale::percent() const
\since 4.1 \since 4.1
Returns the zero digit character of this locale. Returns the zero digit character of this locale.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa toString()
*/ */
QChar QLocale::zeroDigit() const QChar QLocale::zeroDigit() const
{ {
@ -2565,6 +2591,12 @@ QChar QLocale::zeroDigit() const
\since 4.1 \since 4.1
Returns the negative sign character of this locale. Returns the negative sign character of this locale.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa positiveSign(), toString()
*/ */
QChar QLocale::negativeSign() const QChar QLocale::negativeSign() const
{ {
@ -2575,6 +2607,12 @@ QChar QLocale::negativeSign() const
\since 4.5 \since 4.5
Returns the positive sign character of this locale. Returns the positive sign character of this locale.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa negativeSign(), toString()
*/ */
QChar QLocale::positiveSign() const QChar QLocale::positiveSign() const
{ {
@ -2584,7 +2622,14 @@ QChar QLocale::positiveSign() const
/*! /*!
\since 4.1 \since 4.1
Returns the exponential character of this locale. Returns the exponential character of this locale, used to separate exponent
from mantissa in some floating-point numeric representations.
\note This function shall change to return a QString instead of QChar in
Qt6. Callers are encouraged to exploit the QString(QChar) constructor to
convert early in preparation for this.
\sa toString(double, char, int)
*/ */
QChar QLocale::exponential() const QChar QLocale::exponential() const
{ {
@ -2609,7 +2654,7 @@ static char qToLower(char c)
\a f and \a prec have the same meaning as in QString::number(double, char, int). \a f and \a prec have the same meaning as in QString::number(double, char, int).
\sa toDouble() \sa toDouble(), numberOptions(), exponential(), decimalPoint(), zeroDigit(), positiveSign(), percent()
*/ */
QString QLocale::toString(double i, char f, int prec) const QString QLocale::toString(double i, char f, int prec) const

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtCore module of the Qt Toolkit. ** This file is part of the QtCore module of the Qt Toolkit.
@ -1044,8 +1044,8 @@ public:
QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const; QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const;
#endif #endif
// ### Qt 5: We need to return QString from these function since // ### Qt 6: We need to return QString from these function since
// unicode data contains several characters for these fields. // UTF-16 may need surrogate pairs to represent these fields.
QChar decimalPoint() const; QChar decimalPoint() const;
QChar groupSeparator() const; QChar groupSeparator() const;
QChar percent() const; QChar percent() const;

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtCore module of the Qt Toolkit. ** This file is part of the QtCore module of the Qt Toolkit.
@ -67,16 +67,16 @@ static QByteArray envVarLocale()
return lang; return lang;
} }
static QByteArray getMacLocaleName() static QString getMacLocaleName()
{ {
QByteArray result = envVarLocale(); QString result = QString::fromLocal8Bit(envVarLocale());
QString lang, script, cntry; QString lang, script, cntry;
if (result.isEmpty() if (result.isEmpty()
|| (result != "C" && !qt_splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry))) { || (result != QLatin1String("C") && !qt_splitLocaleName(result, lang, script, cntry))) {
QCFType<CFLocaleRef> l = CFLocaleCopyCurrent(); QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
CFStringRef locale = CFLocaleGetIdentifier(l); CFStringRef locale = CFLocaleGetIdentifier(l);
result = QString::fromCFString(locale).toUtf8(); result = QString::fromCFString(locale);
} }
return result; return result;
} }
@ -402,10 +402,10 @@ static QVariant macQuoteString(QSystemLocale::QueryType type, const QStringRef &
QLocale QSystemLocale::fallbackUiLocale() const QLocale QSystemLocale::fallbackUiLocale() const
{ {
return QLocale(QString::fromUtf8(getMacLocaleName().constData())); return QLocale(getMacLocaleName());
} }
QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const QVariant QSystemLocale::query(QueryType type, QVariant in) const
{ {
QMacAutoReleasePool pool; QMacAutoReleasePool pool;
switch(type) { switch(type) {

View File

@ -463,10 +463,10 @@ QT_BEGIN_NAMESPACE
\c{\xHHHH} with more than 2 digits. A pattern like \c{\x2022} neeeds to \c{\xHHHH} with more than 2 digits. A pattern like \c{\x2022} neeeds to
be ported to \c{\x{2022}}, or it will match a space (\c{0x20}) followed be ported to \c{\x{2022}}, or it will match a space (\c{0x20}) followed
by the string \c{"22"}. In general, it is highly recommended to always use by the string \c{"22"}. In general, it is highly recommended to always use
curly braces with the \c{\\x} escape, no matter the amount of digits curly braces with the \c{\x} escape, no matter the amount of digits
specified. specified.
\li A 0-to-n quantification like \c{{,n}} needs to be ported to c{{0,n}} to \li A 0-to-n quantification like \c{{,n}} needs to be ported to \c{{0,n}} to
preserve semantics. Otherwise, a pattern such as \c{\d{,3}} would preserve semantics. Otherwise, a pattern such as \c{\d{,3}} would
actually match a digit followed by the exact string \c{"{,3}"}. actually match a digit followed by the exact string \c{"{,3}"}.

View File

@ -915,7 +915,7 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
}; };
// we're going to read a[0..15] and b[0..15] (32 bytes) // we're going to read a[0..15] and b[0..15] (32 bytes)
for ( ; a + offset + 16 <= end; offset += 16) { for ( ; end - a >= offset + 16; offset += 16) {
#ifdef __AVX2__ #ifdef __AVX2__
__m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset)); __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
__m256i b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset)); __m256i b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
@ -939,7 +939,7 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
} }
// we're going to read a[0..7] and b[0..7] (16 bytes) // we're going to read a[0..7] and b[0..7] (16 bytes)
if (a + offset + 8 <= end) { if (end - a >= offset + 8) {
__m128i a_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset)); __m128i a_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
__m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset)); __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
if (isDifferent(a_data, b_data)) if (isDifferent(a_data, b_data))
@ -949,7 +949,7 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
} }
// we're going to read a[0..3] and b[0..3] (8 bytes) // we're going to read a[0..3] and b[0..3] (8 bytes)
if (a + offset + 4 <= end) { if (end - a >= offset + 4) {
__m128i a_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(a + offset)); __m128i a_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(a + offset));
__m128i b_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(b + offset)); __m128i b_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(b + offset));
if (isDifferent(a_data, b_data)) if (isDifferent(a_data, b_data))
@ -970,7 +970,7 @@ static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
if (l >= 8) { if (l >= 8) {
const QChar *end = a + l; const QChar *end = a + l;
const uint16x8_t mask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; const uint16x8_t mask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
while (a + 7 < end) { while (end - a > 7) {
uint16x8_t da = vld1q_u16(reinterpret_cast<const uint16_t *>(a)); uint16x8_t da = vld1q_u16(reinterpret_cast<const uint16_t *>(a));
uint16x8_t db = vld1q_u16(reinterpret_cast<const uint16_t *>(b)); uint16x8_t db = vld1q_u16(reinterpret_cast<const uint16_t *>(b));
@ -5109,21 +5109,25 @@ bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
} }
/*! /*!
Returns \c true if the string only contains uppercase letters, Returns \c true if the string is uppercase, that is, it's identical
otherwise returns \c false. to its toUpper() folding.
Note that this does \e not mean that the string does not contain
lowercase letters (some lowercase letters do not have a uppercase
folding; they are left unchanged by toUpper()).
For more information, refer to the Unicode standard, section 3.13.
\since 5.12 \since 5.12
\sa QChar::isUpper(), isLower() \sa QChar::toUpper(), isLower()
*/ */
bool QString::isUpper() const bool QString::isUpper() const
{ {
if (isEmpty()) QStringIterator it(*this);
return false;
const QChar *d = data(); while (it.hasNext()) {
uint uc = it.nextUnchecked();
for (int i = 0, max = size(); i < max; ++i) { if (qGetProp(uc)->cases[QUnicodeTables::UpperCase].diff)
if (!d[i].isUpper())
return false; return false;
} }
@ -5131,21 +5135,25 @@ bool QString::isUpper() const
} }
/*! /*!
Returns \c true if the string only contains lowercase letters, Returns \c true if the string is lowercase, that is, it's identical
otherwise returns \c false. to its toLower() folding.
Note that this does \e not mean that the string does not contain
uppercase letters (some uppercase letters do not have a lowercase
folding; they are left unchanged by toLower()).
For more information, refer to the Unicode standard, section 3.13.
\since 5.12 \since 5.12
\sa QChar::isLower(), isUpper() \sa QChar::toLower(), isUpper()
*/ */
bool QString::isLower() const bool QString::isLower() const
{ {
if (isEmpty()) QStringIterator it(*this);
return false;
const QChar *d = data(); while (it.hasNext()) {
uint uc = it.nextUnchecked();
for (int i = 0, max = size(); i < max; ++i) { if (qGetProp(uc)->cases[QUnicodeTables::LowerCase].diff)
if (!d[i].isLower())
return false; return false;
} }

View File

@ -137,13 +137,12 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
#endif #endif
return false; return false;
} }
const SectionNode &node = sectionNodes.at(index);
const QDate date = v.date(); QCalendar::YearMonthDay date = calendar.partsFromDate(v.date());
if (!date.isValid())
return false;
const QTime time = v.time(); const QTime time = v.time();
int year = date.year(calendar);
int month = date.month(calendar);
int day = date.day(calendar);
int hour = time.hour(); int hour = time.hour();
int minute = time.minute(); int minute = time.minute();
int second = time.second(); int second = time.second();
@ -152,14 +151,15 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
// Only offset from UTC is amenable to setting an int value: // Only offset from UTC is amenable to setting an int value:
int offset = tspec == Qt::OffsetFromUTC ? v.offsetFromUtc() : 0; int offset = tspec == Qt::OffsetFromUTC ? v.offsetFromUtc() : 0;
const SectionNode &node = sectionNodes.at(index);
switch (node.type) { switch (node.type) {
case Hour24Section: case Hour12Section: hour = newVal; break; case Hour24Section: case Hour12Section: hour = newVal; break;
case MinuteSection: minute = newVal; break; case MinuteSection: minute = newVal; break;
case SecondSection: second = newVal; break; case SecondSection: second = newVal; break;
case MSecSection: msec = newVal; break; case MSecSection: msec = newVal; break;
case YearSection2Digits: case YearSection2Digits:
case YearSection: year = newVal; break; case YearSection: date.year = newVal; break;
case MonthSection: month = newVal; break; case MonthSection: date.month = newVal; break;
case DaySection: case DaySection:
case DayOfWeekSectionShort: case DayOfWeekSectionShort:
case DayOfWeekSectionLong: case DayOfWeekSectionLong:
@ -169,7 +169,7 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
// to 31 for february should return true // to 31 for february should return true
return false; return false;
} }
day = newVal; date.day = newVal;
break; break;
case TimeZoneSection: case TimeZoneSection:
if (newVal < absoluteMin(index) || newVal > absoluteMax(index)) if (newVal < absoluteMin(index) || newVal > absoluteMax(index))
@ -185,15 +185,14 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
} }
if (!(node.type & DaySectionMask)) { if (!(node.type & DaySectionMask)) {
if (day < cachedDay) if (date.day < cachedDay)
day = cachedDay; date.day = cachedDay;
const int max = calendar.daysInMonth(month, year); const int max = calendar.daysInMonth(date.month, date.year);
if (day > max) { if (date.day > max)
day = max; date.day = max;
}
} }
const QDate newDate(year, month, day, calendar); const QDate newDate = calendar.dateFromParts(date);
const QTime newTime(hour, minute, second, msec); const QTime newTime(hour, minute, second, msec);
if (!newDate.isValid() || !newTime.isValid()) if (!newDate.isValid() || !newTime.isValid())
return false; return false;

View File

@ -374,7 +374,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
*/ */
/*! /*!
\enum QLineF::IntersectionType \enum QLineF::IntersectType
Describes the intersection between two lines. Describes the intersection between two lines.

View File

@ -51,10 +51,10 @@ QT_BEGIN_NAMESPACE
of the scope. of the scope.
\ingroup misc \ingroup misc
QScopeGuard<F> is a class which sole purpose is to run a function \e F in QScopeGuard<F> is a class of which the sole purpose is to run the function
its destructor. This is useful for guaranteeing your cleanup code is \a f in its destructor. This is useful for guaranteeing
executed, whether the function is exited normally, exited early by a return your cleanup code is executed, whether the function is exited normally,
statement, or exited by an exception. exited early by a return statement, or exited by an exception.
If \e F is a lambda then you cannot instantiate the template directly, If \e F is a lambda then you cannot instantiate the template directly,
therefore the qScopeGuard() helper is provided and QScopeGuard<F> is made a therefore the qScopeGuard() helper is provided and QScopeGuard<F> is made a

View File

@ -1285,6 +1285,8 @@
\relates QSharedPointer \relates QSharedPointer
\since 5.14 \since 5.14
Returns a shared pointer to the pointer held by \a src.
Same as qSharedPointerObjectCast(). This function is provided for STL Same as qSharedPointerObjectCast(). This function is provided for STL
compatibility. compatibility.
*/ */

View File

@ -667,9 +667,9 @@ QHoverEvent::~QHoverEvent()
if that widget does not handle the event they are sent to the if that widget does not handle the event they are sent to the
focus widget. Wheel events are generated for both mouse wheels focus widget. Wheel events are generated for both mouse wheels
and trackpad scroll gestures. There are two ways to read the and trackpad scroll gestures. There are two ways to read the
wheel event delta: angleDelta() returns the delta in wheel wheel event delta: angleDelta() returns the deltas in wheel
degrees. This value is always provided. pixelDelta() returns degrees. These values are always provided. pixelDelta() returns
the delta in screen pixels and is available on platforms that the deltas in screen pixels, and is available on platforms that
have high-resolution trackpads, such as \macos. If that is the have high-resolution trackpads, such as \macos. If that is the
case, source() will return Qt::MouseEventSynthesizedBySystem. case, source() will return Qt::MouseEventSynthesizedBySystem.
@ -852,7 +852,7 @@ QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos,
by \a globalPos. by \a globalPos.
\a pixelDelta contains the scrolling distance in pixels on screen, while \a pixelDelta contains the scrolling distance in pixels on screen, while
\a angleDelta contains the wheel rotation distance. \a pixelDelta is \a angleDelta contains the wheel rotation angle. \a pixelDelta is
optional and can be null. optional and can be null.
The mouse and keyboard states at the time of the event are specified by The mouse and keyboard states at the time of the event are specified by
@ -914,10 +914,16 @@ QWheelEvent::~QWheelEvent()
/*! /*!
\fn QPoint QWheelEvent::angleDelta() const \fn QPoint QWheelEvent::angleDelta() const
Returns the distance that the wheel is rotated, in eighths of a Returns the relative amount that the wheel was rotated, in eighths of a
degree. A positive value indicates that the wheel was rotated degree. A positive value indicates that the wheel was rotated forwards away
forwards away from the user; a negative value indicates that the from the user; a negative value indicates that the wheel was rotated
wheel was rotated backwards toward the user. backwards toward the user. \c angleDelta().y() provides the angle through
which the common vertical mouse wheel was rotated since the previous event.
\c angleDelta().x() provides the angle through which the horizontal mouse
wheel was rotated, if the mouse has a horizontal wheel; otherwise it stays
at zero. Some mice allow the user to tilt the wheel to perform horizontal
scrolling, and some touchpads support a horizontal scrolling gesture; that
will also appear in \c angleDelta().x().
Most mouse types work in steps of 15 degrees, in which case the Most mouse types work in steps of 15 degrees, in which case the
delta value is a multiple of 120; i.e., 120 units * 1/8 = 15 degrees. delta value is a multiple of 120; i.e., 120 units * 1/8 = 15 degrees.
@ -926,7 +932,9 @@ QWheelEvent::~QWheelEvent()
that are less than 120 units (less than 15 degrees). To support this that are less than 120 units (less than 15 degrees). To support this
possibility, you can either cumulatively add the delta values from events possibility, you can either cumulatively add the delta values from events
until the value of 120 is reached, then scroll the widget, or you can until the value of 120 is reached, then scroll the widget, or you can
partially scroll the widget in response to each wheel event. partially scroll the widget in response to each wheel event. But to
provide a more native feel, you should prefer \l pixelDelta() on platforms
where it's available.
Example: Example:
@ -937,6 +945,8 @@ QWheelEvent::~QWheelEvent()
\li scrolling is about to begin, but the distance did not yet change (Qt::ScrollBegin), \li scrolling is about to begin, but the distance did not yet change (Qt::ScrollBegin),
\li or scrolling has ended and the distance did not change anymore (Qt::ScrollEnd). \li or scrolling has ended and the distance did not change anymore (Qt::ScrollEnd).
\endlist \endlist
\see pixelDelta()
*/ */
/*! /*!

View File

@ -605,8 +605,13 @@ static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOME
The following parameters are available for \c {-platform windows}: The following parameters are available for \c {-platform windows}:
\list \list
\li \c {altgr}, detect the key \c {AltGr} found on some keyboards as
Qt::GroupSwitchModifier (since Qt 5.12).
\li \c {dialogs=[xp|none]}, \c xp uses XP-style native dialogs and \li \c {dialogs=[xp|none]}, \c xp uses XP-style native dialogs and
\c none disables them. \c none disables them.
\li \c {dpiawareness=[0|1|2} Sets the DPI awareness of the process
(see \l{High DPI Displays}, since Qt 5.4).
\li \c {fontengine=freetype}, uses the FreeType font engine. \li \c {fontengine=freetype}, uses the FreeType font engine.
\li \c {menus=[native|none]}, controls the use of native menus. \li \c {menus=[native|none]}, controls the use of native menus.
@ -616,10 +621,23 @@ static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOME
provide hover signals. They are mainly intended for Qt Quick. provide hover signals. They are mainly intended for Qt Quick.
By default, they will be used if the application is not an By default, they will be used if the application is not an
instance of QApplication or for Qt Quick Controls 2 instance of QApplication or for Qt Quick Controls 2
applications. applications (since Qt 5.10).
\li \c {altgr}, detect the key \c {AltGr} found on some keyboards as \li \c {nocolorfonts} Turn off DirectWrite Color fonts
Qt::GroupSwitchModifier. (since Qt 5.8).
\li \c {nodirectwrite} Turn off DirectWrite fonts (since Qt 5.8).
\li \c {nomousefromtouch} Ignores mouse events synthesized
from touch events by the operating system.
\li \c {nowmpointer} Switches from Pointer Input Messages handling
to legacy mouse handling (since Qt 5.12).
\li \c {reverse} Activates Right-to-left mode (experimental).
Windows title bars will be shown accordingly in Right-to-left locales
(since Qt 5.13).
\li \c {tabletabsoluterange=<value>} Sets a value for mouse mode detection
of WinTab tablets (Legacy, since Qt 5.3).
\endlist \endlist
The following parameter is available for \c {-platform cocoa} (on macOS): The following parameter is available for \c {-platform cocoa} (on macOS):
@ -3293,12 +3311,8 @@ QPalette QGuiApplication::palette()
*/ */
void QGuiApplication::setPalette(const QPalette &pal) void QGuiApplication::setPalette(const QPalette &pal)
{ {
if (QGuiApplicationPrivate::app_pal && pal.isCopyOf(*QGuiApplicationPrivate::app_pal)) if (!QGuiApplicationPrivate::setPalette(pal))
return; return;
if (!QGuiApplicationPrivate::app_pal)
QGuiApplicationPrivate::app_pal = new QPalette(pal);
else
*QGuiApplicationPrivate::app_pal = pal;
QCoreApplication::setAttribute(Qt::AA_SetPalette); QCoreApplication::setAttribute(Qt::AA_SetPalette);
@ -3306,6 +3320,19 @@ void QGuiApplication::setPalette(const QPalette &pal)
qGuiApp->d_func()->sendApplicationPaletteChange(); qGuiApp->d_func()->sendApplicationPaletteChange();
} }
bool QGuiApplicationPrivate::setPalette(const QPalette &palette)
{
if (app_pal && palette.isCopyOf(*app_pal))
return false;
if (!app_pal)
app_pal = new QPalette(palette);
else
*app_pal = palette;
return true;
}
void QGuiApplicationPrivate::applyWindowGeometrySpecificationTo(QWindow *window) void QGuiApplicationPrivate::applyWindowGeometrySpecificationTo(QWindow *window)
{ {
windowGeometrySpecification.applyTo(window); windowGeometrySpecification.applyTo(window);

View File

@ -323,6 +323,8 @@ public:
static void resetCachedDevicePixelRatio(); static void resetCachedDevicePixelRatio();
static bool setPalette(const QPalette &palette);
protected: protected:
virtual void notifyThemeChanged(); virtual void notifyThemeChanged();
virtual void sendApplicationPaletteChange(bool toAllWidgets = false, const char *className = nullptr); virtual void sendApplicationPaletteChange(bool toAllWidgets = false, const char *className = nullptr);

View File

@ -69,7 +69,7 @@ public:
int deviceCount(QInputDeviceManager::DeviceType type) const; int deviceCount(QInputDeviceManager::DeviceType type) const;
void setDeviceCount(QInputDeviceManager::DeviceType type, int count); void setDeviceCount(QInputDeviceManager::DeviceType type, int count);
std::array<int, QInputDeviceManager::NumDeviceTypes> m_deviceCount; std::array<int, QInputDeviceManager::NumDeviceTypes> m_deviceCount = {};
Qt::KeyboardModifiers keyboardModifiers; Qt::KeyboardModifiers keyboardModifiers;
}; };

View File

@ -1330,6 +1330,7 @@ void QOpenGL2PaintEngineExPrivate::drawVertexArrays(const float *data, int *stop
QOpenGL2PaintEngineEx::QOpenGL2PaintEngineEx() QOpenGL2PaintEngineEx::QOpenGL2PaintEngineEx()
: QPaintEngineEx(*(new QOpenGL2PaintEngineExPrivate(this))) : QPaintEngineEx(*(new QOpenGL2PaintEngineExPrivate(this)))
{ {
gccaps &= ~QPaintEngine::RasterOpModes;
} }
QOpenGL2PaintEngineEx::~QOpenGL2PaintEngineEx() QOpenGL2PaintEngineEx::~QOpenGL2PaintEngineEx()

View File

@ -207,7 +207,12 @@ int QTextMarkdownImporter::cbEnterBlock(int blockType, void *det)
charFmt.setFontWeight(QFont::Bold); charFmt.setFontWeight(QFont::Bold);
blockFmt.setHeadingLevel(int(detail->level)); blockFmt.setHeadingLevel(int(detail->level));
m_needsInsertBlock = false; m_needsInsertBlock = false;
m_cursor->insertBlock(blockFmt, charFmt); if (m_doc->isEmpty()) {
m_cursor->setBlockFormat(blockFmt);
m_cursor->setCharFormat(charFmt);
} else {
m_cursor->insertBlock(blockFmt, charFmt);
}
qCDebug(lcMD, "H%d", detail->level); qCDebug(lcMD, "H%d", detail->level);
} break; } break;
case MD_BLOCK_LI: { case MD_BLOCK_LI: {
@ -592,7 +597,12 @@ void QTextMarkdownImporter::insertBlock()
blockFormat.setMarker(m_markerType); blockFormat.setMarker(m_markerType);
if (!m_listStack.isEmpty()) if (!m_listStack.isEmpty())
blockFormat.setIndent(m_listStack.count()); blockFormat.setIndent(m_listStack.count());
m_cursor->insertBlock(blockFormat, charFormat); if (m_doc->isEmpty()) {
m_cursor->setBlockFormat(blockFormat);
m_cursor->setCharFormat(charFormat);
} else {
m_cursor->insertBlock(blockFormat, charFormat);
}
if (m_needsInsertList) { if (m_needsInsertList) {
m_listStack.push(m_cursor->createList(m_listFormat)); m_listStack.push(m_cursor->createList(m_listFormat));
} else if (!m_listStack.isEmpty() && m_listItem) { } else if (!m_listStack.isEmpty() && m_listItem) {

View File

@ -62,6 +62,9 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
// Clang does not consider __declspec(nothrow) as nothrow
QT_WARNING_DISABLE_CLANG("-Wmicrosoft-exception-spec")
// Convert from design units to logical pixels // Convert from design units to logical pixels
#define DESIGN_TO_LOGICAL(DESIGN_UNIT_VALUE) \ #define DESIGN_TO_LOGICAL(DESIGN_UNIT_VALUE) \
QFixed::fromReal((qreal(DESIGN_UNIT_VALUE) / qreal(m_unitsPerEm)) * fontDef.pixelSize) QFixed::fromReal((qreal(DESIGN_UNIT_VALUE) / qreal(m_unitsPerEm)) * fontDef.pixelSize)

View File

@ -38,6 +38,7 @@
****************************************************************************/ ****************************************************************************/
#include "qlibinputtouch_p.h" #include "qlibinputtouch_p.h"
#include "qtouchoutputmapping_p.h"
#include <libinput.h> #include <libinput.h>
#include <QtGui/QGuiApplication> #include <QtGui/QGuiApplication>
#include <QtGui/QScreen> #include <QtGui/QScreen>
@ -45,6 +46,8 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(qLcLibInput)
QWindowSystemInterface::TouchPoint *QLibInputTouch::DeviceState::point(int32_t slot) QWindowSystemInterface::TouchPoint *QLibInputTouch::DeviceState::point(int32_t slot)
{ {
const int id = qMax(0, slot); const int id = qMax(0, slot);
@ -62,12 +65,23 @@ QLibInputTouch::DeviceState *QLibInputTouch::deviceState(libinput_event_touch *e
return &m_devState[dev]; return &m_devState[dev];
} }
static inline QPointF getPos(libinput_event_touch *e) QPointF QLibInputTouch::getPos(libinput_event_touch *e)
{ {
// TODO Map to correct screen using QTouchOutputMapping. DeviceState *state = deviceState(e);
// Perhaps investigate libinput_device_get_output_name as well.
// For now just use the primary screen.
QScreen *screen = QGuiApplication::primaryScreen(); QScreen *screen = QGuiApplication::primaryScreen();
if (!state->m_screenName.isEmpty()) {
if (!m_screen) {
const QList<QScreen *> screens = QGuiApplication::screens();
for (QScreen *s : screens) {
if (s->name() == state->m_screenName) {
m_screen = s;
break;
}
}
}
if (m_screen)
screen = m_screen;
}
const QRect geom = QHighDpi::toNativePixels(screen->geometry(), screen); const QRect geom = QHighDpi::toNativePixels(screen->geometry(), screen);
const double x = libinput_event_touch_get_x_transformed(e, geom.width()); const double x = libinput_event_touch_get_x_transformed(e, geom.width());
const double y = libinput_event_touch_get_y_transformed(e, geom.height()); const double y = libinput_event_touch_get_y_transformed(e, geom.height());
@ -76,9 +90,25 @@ static inline QPointF getPos(libinput_event_touch *e)
void QLibInputTouch::registerDevice(libinput_device *dev) void QLibInputTouch::registerDevice(libinput_device *dev)
{ {
struct udev_device *udev_device;
udev_device = libinput_device_get_udev_device(dev);
QString devNode = QString::fromUtf8(udev_device_get_devnode(udev_device));
QString devName = QString::fromUtf8(libinput_device_get_name(dev));
qCDebug(qLcLibInput, "libinput: registerDevice %s - %s",
qPrintable(devNode), qPrintable(devName));
QTouchOutputMapping mapping;
if (mapping.load()) {
m_devState[dev].m_screenName = mapping.screenNameForDeviceNode(devNode);
if (!m_devState[dev].m_screenName.isEmpty())
qCDebug(qLcLibInput, "libinput: Mapping device %s to screen %s",
qPrintable(devNode), qPrintable(m_devState[dev].m_screenName));
}
QTouchDevice *&td = m_devState[dev].m_touchDevice; QTouchDevice *&td = m_devState[dev].m_touchDevice;
td = new QTouchDevice; td = new QTouchDevice;
td->setName(QString::fromUtf8(libinput_device_get_name(dev))); td->setName(devName);
td->setType(QTouchDevice::TouchScreen); td->setType(QTouchDevice::TouchScreen);
td->setCapabilities(QTouchDevice::Position | QTouchDevice::Area); td->setCapabilities(QTouchDevice::Position | QTouchDevice::Area);
QWindowSystemInterface::registerTouchDevice(td); QWindowSystemInterface::registerTouchDevice(td);

View File

@ -42,6 +42,7 @@
#include <QtCore/QHash> #include <QtCore/QHash>
#include <QtCore/QList> #include <QtCore/QList>
#include <QtCore/QPointer>
#include <qpa/qwindowsysteminterface.h> #include <qpa/qwindowsysteminterface.h>
// //
@ -60,6 +61,7 @@ struct libinput_device;
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QScreen;
class QLibInputTouch class QLibInputTouch
{ {
public: public:
@ -73,15 +75,18 @@ public:
private: private:
struct DeviceState { struct DeviceState {
DeviceState() : m_touchDevice(nullptr) { } DeviceState() : m_touchDevice(nullptr), m_screenName() { }
QWindowSystemInterface::TouchPoint *point(int32_t slot); QWindowSystemInterface::TouchPoint *point(int32_t slot);
QList<QWindowSystemInterface::TouchPoint> m_points; QList<QWindowSystemInterface::TouchPoint> m_points;
QTouchDevice *m_touchDevice; QTouchDevice *m_touchDevice;
QString m_screenName;
}; };
DeviceState *deviceState(libinput_event_touch *e); DeviceState *deviceState(libinput_event_touch *e);
QPointF getPos(libinput_event_touch *e);
QHash<libinput_device *, DeviceState> m_devState; QHash<libinput_device *, DeviceState> m_devState;
mutable QPointer<QScreen> m_screen;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -25,7 +25,6 @@ SOURCES += main.mm \
qcocoaclipboard.mm \ qcocoaclipboard.mm \
qcocoadrag.mm \ qcocoadrag.mm \
qmacclipboard.mm \ qmacclipboard.mm \
qcocoasystemsettings.mm \
qcocoainputcontext.mm \ qcocoainputcontext.mm \
qcocoaservices.mm \ qcocoaservices.mm \
qcocoasystemtrayicon.mm \ qcocoasystemtrayicon.mm \
@ -59,7 +58,6 @@ HEADERS += qcocoaintegration.h \
qcocoaclipboard.h \ qcocoaclipboard.h \
qcocoadrag.h \ qcocoadrag.h \
qmacclipboard.h \ qmacclipboard.h \
qcocoasystemsettings.h \
qcocoainputcontext.h \ qcocoainputcontext.h \
qcocoaservices.h \ qcocoaservices.h \
qcocoasystemtrayicon.h \ qcocoasystemtrayicon.h \

View File

@ -1,54 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QCOCOASYSTEMSETTINGS_H
#define QCOCOASYSTEMSETTINGS_H
#include <QtCore/qhash.h>
#include <QtGui/qpalette.h>
#include <qpa/qplatformtheme.h>
QT_BEGIN_NAMESPACE
QPalette * qt_mac_createSystemPalette();
QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes();
QT_END_NAMESPACE
#endif

View File

@ -1,245 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qcocoasystemsettings.h"
#include "qcocoahelpers.h"
#include <QtCore/private/qcore_mac_p.h>
#include <QtGui/qfont.h>
#include <QtGui/private/qcoregraphics_p.h>
#if !QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
@interface NSColor (MojaveForwardDeclarations)
@property (class, strong, readonly) NSColor *selectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextBackgroundColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSColor *unemphasizedSelectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSArray<NSColor *> *alternatingContentBackgroundColors NS_AVAILABLE_MAC(10_14);
// Missing from non-Mojave SDKs, even if introduced in 10.10
@property (class, strong, readonly) NSColor *linkColor NS_AVAILABLE_MAC(10_10);
@end
#endif
QT_BEGIN_NAMESPACE
QPalette * qt_mac_createSystemPalette()
{
QColor qc;
// Standard palette initialization (copied from Qt 4 styles)
QBrush backgroundBrush = qt_mac_toQBrush([NSColor windowBackgroundColor]);
QColor background = backgroundBrush.color();
QColor light(background.lighter(110));
QColor dark(background.darker(160));
QColor mid(background.darker(140));
QPalette *palette = new QPalette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
palette->setBrush(QPalette::Window, backgroundBrush);
palette->setBrush(QPalette::Disabled, QPalette::WindowText, dark);
palette->setBrush(QPalette::Disabled, QPalette::Text, dark);
palette->setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
palette->setBrush(QPalette::Disabled, QPalette::Base, backgroundBrush);
QBrush textBackgroundBrush = qt_mac_toQBrush([NSColor textBackgroundColor]);
palette->setBrush(QPalette::Active, QPalette::Base, textBackgroundBrush);
palette->setBrush(QPalette::Inactive, QPalette::Base, textBackgroundBrush);
palette->setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191));
palette->setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191));
palette->setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191));
// System palette initialization:
QBrush br = qt_mac_toQBrush([NSColor selectedControlColor]);
palette->setBrush(QPalette::Active, QPalette::Highlight, br);
if (__builtin_available(macOS 10.14, *)) {
const auto inactiveHighlight = qt_mac_toQBrush([NSColor unemphasizedSelectedContentBackgroundColor]);
palette->setBrush(QPalette::Inactive, QPalette::Highlight, inactiveHighlight);
palette->setBrush(QPalette::Disabled, QPalette::Highlight, inactiveHighlight);
} else {
palette->setBrush(QPalette::Inactive, QPalette::Highlight, br);
palette->setBrush(QPalette::Disabled, QPalette::Highlight, br);
}
palette->setBrush(QPalette::Shadow, qt_mac_toQColor([NSColor shadowColor]));
qc = qt_mac_toQColor([NSColor controlTextColor]);
palette->setColor(QPalette::Active, QPalette::Text, qc);
palette->setColor(QPalette::Active, QPalette::WindowText, qc);
palette->setColor(QPalette::Active, QPalette::HighlightedText, qc);
palette->setColor(QPalette::Inactive, QPalette::Text, qc);
palette->setColor(QPalette::Inactive, QPalette::WindowText, qc);
palette->setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
palette->setColor(QPalette::Disabled, QPalette::Text, qc);
palette->setColor(QPalette::Disabled, QPalette::WindowText, qc);
palette->setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
palette->setBrush(QPalette::ToolTipBase, qt_mac_toQBrush([NSColor controlColor]));
palette->setColor(QPalette::Normal, QPalette::Link, qt_mac_toQColor([NSColor linkColor]));
return palette;
}
struct QMacPaletteMap {
inline QMacPaletteMap(QPlatformTheme::Palette p, NSColor *a, NSColor *i) :
active(a), inactive(i), paletteRole(p) { }
NSColor *active;
NSColor *inactive;
QPlatformTheme::Palette paletteRole;
};
#define MAC_PALETTE_ENTRY(pal, active, inactive) \
QMacPaletteMap(pal, [NSColor active], [NSColor inactive])
static QMacPaletteMap mac_widget_colors[] = {
MAC_PALETTE_ENTRY(QPlatformTheme::ToolButtonPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::ButtonPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::HeaderPalette, headerTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::ComboBoxPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::ItemViewPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::MessageBoxLabelPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::TabBarPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::LabelPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::GroupBoxPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::MenuPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::MenuBarPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::TextEditPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::TextLineEditPalette, textColor, disabledControlTextColor)
};
#undef MAC_PALETTE_ENTRY
static const int mac_widget_colors_count = sizeof(mac_widget_colors) / sizeof(mac_widget_colors[0]);
QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
{
QHash<QPlatformTheme::Palette, QPalette*> palettes;
QColor qc;
for (int i = 0; i < mac_widget_colors_count; i++) {
QPalette &pal = *qt_mac_createSystemPalette();
if (mac_widget_colors[i].active) {
qc = qt_mac_toQColor(mac_widget_colors[i].active);
pal.setColor(QPalette::Active, QPalette::Text, qc);
pal.setColor(QPalette::Inactive, QPalette::Text, qc);
pal.setColor(QPalette::Active, QPalette::WindowText, qc);
pal.setColor(QPalette::Inactive, QPalette::WindowText, qc);
pal.setColor(QPalette::Active, QPalette::HighlightedText, qc);
pal.setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
pal.setColor(QPalette::Active, QPalette::ButtonText, qc);
pal.setColor(QPalette::Inactive, QPalette::ButtonText, qc);
qc = qt_mac_toQColor(mac_widget_colors[i].inactive);
pal.setColor(QPalette::Disabled, QPalette::Text, qc);
pal.setColor(QPalette::Disabled, QPalette::WindowText, qc);
pal.setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
pal.setColor(QPalette::Disabled, QPalette::ButtonText, qc);
}
if (mac_widget_colors[i].paletteRole == QPlatformTheme::MenuPalette
|| mac_widget_colors[i].paletteRole == QPlatformTheme::MenuBarPalette) {
NSColor *selectedMenuItemColor = nil;
if (__builtin_available(macOS 10.14, *)) {
// Cheap approximation for NSVisualEffectView (see deprecation note for selectedMenuItemTextColor)
selectedMenuItemColor = [[NSColor selectedContentBackgroundColor] highlightWithLevel:0.4];
} else {
// selectedMenuItemColor would presumably be the correct color to use as the background
// for selected menu items. But that color is always blue, and doesn't follow the
// appearance color in system preferences. So we therefore deliberatly choose to use
// keyboardFocusIndicatorColor instead, which appears to have the same color value.
selectedMenuItemColor = [NSColor keyboardFocusIndicatorColor];
}
pal.setBrush(QPalette::Highlight, qt_mac_toQColor(selectedMenuItemColor));
qc = qt_mac_toQColor([NSColor labelColor]);
pal.setBrush(QPalette::ButtonText, qc);
pal.setBrush(QPalette::Text, qc);
qc = qt_mac_toQColor([NSColor selectedMenuItemTextColor]);
pal.setBrush(QPalette::HighlightedText, qc);
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
pal.setBrush(QPalette::Disabled, QPalette::Text, qc);
} else if ((mac_widget_colors[i].paletteRole == QPlatformTheme::ButtonPalette)
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::HeaderPalette)
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::TabBarPalette)) {
pal.setColor(QPalette::Disabled, QPalette::ButtonText,
pal.color(QPalette::Disabled, QPalette::Text));
pal.setColor(QPalette::Inactive, QPalette::ButtonText,
pal.color(QPalette::Inactive, QPalette::Text));
pal.setColor(QPalette::Active, QPalette::ButtonText,
pal.color(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::ItemViewPalette) {
NSArray<NSColor *> *baseColors = nil;
NSColor *activeHighlightColor = nil;
if (__builtin_available(macOS 10.14, *)) {
baseColors = [NSColor alternatingContentBackgroundColors];
activeHighlightColor = [NSColor selectedContentBackgroundColor];
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
qt_mac_toQBrush([NSColor unemphasizedSelectedTextColor]));
} else {
baseColors = [NSColor controlAlternatingRowBackgroundColors];
activeHighlightColor = [NSColor alternateSelectedControlColor];
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
pal.brush(QPalette::Active, QPalette::Text));
}
pal.setBrush(QPalette::Base, qt_mac_toQBrush(baseColors[0]));
pal.setBrush(QPalette::AlternateBase, qt_mac_toQBrush(baseColors[1]));
pal.setBrush(QPalette::Active, QPalette::Highlight,
qt_mac_toQBrush(activeHighlightColor));
pal.setBrush(QPalette::Active, QPalette::HighlightedText,
qt_mac_toQBrush([NSColor alternateSelectedControlTextColor]));
pal.setBrush(QPalette::Inactive, QPalette::Text,
pal.brush(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextEditPalette) {
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
pal.setBrush(QPalette::Inactive, QPalette::Text,
pal.brush(QPalette::Active, QPalette::Text));
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
pal.brush(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextLineEditPalette
|| mac_widget_colors[i].paletteRole == QPlatformTheme::ComboBoxPalette) {
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
pal.setBrush(QPalette::Disabled, QPalette::Base,
pal.brush(QPalette::Active, QPalette::Base));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::LabelPalette) {
qc = qt_mac_toQColor([NSColor labelColor]);
pal.setBrush(QPalette::Inactive, QPalette::ToolTipText, qc);
}
palettes.insert(mac_widget_colors[i].paletteRole, &pal);
}
return palettes;
}
QT_END_NAMESPACE

View File

@ -45,7 +45,6 @@
#include <QtCore/QOperatingSystemVersion> #include <QtCore/QOperatingSystemVersion>
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include "qcocoasystemsettings.h"
#include "qcocoasystemtrayicon.h" #include "qcocoasystemtrayicon.h"
#include "qcocoamenuitem.h" #include "qcocoamenuitem.h"
#include "qcocoamenu.h" #include "qcocoamenu.h"
@ -80,8 +79,203 @@
#include <CoreServices/CoreServices.h> #include <CoreServices/CoreServices.h>
#if !QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
@interface NSColor (MojaveForwardDeclarations)
@property (class, strong, readonly) NSColor *selectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextBackgroundColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSColor *unemphasizedSelectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
@property (class, strong, readonly) NSArray<NSColor *> *alternatingContentBackgroundColors NS_AVAILABLE_MAC(10_14);
// Missing from non-Mojave SDKs, even if introduced in 10.10
@property (class, strong, readonly) NSColor *linkColor NS_AVAILABLE_MAC(10_10);
@end
#endif
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
static QPalette *qt_mac_createSystemPalette()
{
QColor qc;
// Standard palette initialization (copied from Qt 4 styles)
QBrush backgroundBrush = qt_mac_toQBrush([NSColor windowBackgroundColor]);
QColor background = backgroundBrush.color();
QColor light(background.lighter(110));
QColor dark(background.darker(160));
QColor mid(background.darker(140));
QPalette *palette = new QPalette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
palette->setBrush(QPalette::Window, backgroundBrush);
palette->setBrush(QPalette::Disabled, QPalette::WindowText, dark);
palette->setBrush(QPalette::Disabled, QPalette::Text, dark);
palette->setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
palette->setBrush(QPalette::Disabled, QPalette::Base, backgroundBrush);
QBrush textBackgroundBrush = qt_mac_toQBrush([NSColor textBackgroundColor]);
palette->setBrush(QPalette::Active, QPalette::Base, textBackgroundBrush);
palette->setBrush(QPalette::Inactive, QPalette::Base, textBackgroundBrush);
palette->setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191));
palette->setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191));
palette->setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191));
// System palette initialization:
QBrush br = qt_mac_toQBrush([NSColor selectedControlColor]);
palette->setBrush(QPalette::Active, QPalette::Highlight, br);
if (__builtin_available(macOS 10.14, *)) {
const auto inactiveHighlight = qt_mac_toQBrush([NSColor unemphasizedSelectedContentBackgroundColor]);
palette->setBrush(QPalette::Inactive, QPalette::Highlight, inactiveHighlight);
palette->setBrush(QPalette::Disabled, QPalette::Highlight, inactiveHighlight);
} else {
palette->setBrush(QPalette::Inactive, QPalette::Highlight, br);
palette->setBrush(QPalette::Disabled, QPalette::Highlight, br);
}
palette->setBrush(QPalette::Shadow, qt_mac_toQColor([NSColor shadowColor]));
qc = qt_mac_toQColor([NSColor controlTextColor]);
palette->setColor(QPalette::Active, QPalette::Text, qc);
palette->setColor(QPalette::Active, QPalette::WindowText, qc);
palette->setColor(QPalette::Active, QPalette::HighlightedText, qc);
palette->setColor(QPalette::Inactive, QPalette::Text, qc);
palette->setColor(QPalette::Inactive, QPalette::WindowText, qc);
palette->setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
palette->setColor(QPalette::Disabled, QPalette::Text, qc);
palette->setColor(QPalette::Disabled, QPalette::WindowText, qc);
palette->setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
palette->setBrush(QPalette::ToolTipBase, qt_mac_toQBrush([NSColor controlColor]));
palette->setColor(QPalette::Normal, QPalette::Link, qt_mac_toQColor([NSColor linkColor]));
return palette;
}
struct QMacPaletteMap {
inline QMacPaletteMap(QPlatformTheme::Palette p, NSColor *a, NSColor *i) :
active(a), inactive(i), paletteRole(p) { }
NSColor *active;
NSColor *inactive;
QPlatformTheme::Palette paletteRole;
};
#define MAC_PALETTE_ENTRY(pal, active, inactive) \
QMacPaletteMap(pal, [NSColor active], [NSColor inactive])
static QMacPaletteMap mac_widget_colors[] = {
MAC_PALETTE_ENTRY(QPlatformTheme::ToolButtonPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::ButtonPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::HeaderPalette, headerTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::ComboBoxPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::ItemViewPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::MessageBoxLabelPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::TabBarPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::LabelPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::GroupBoxPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::MenuPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::MenuBarPalette, controlTextColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::TextEditPalette, textColor, disabledControlTextColor),
MAC_PALETTE_ENTRY(QPlatformTheme::TextLineEditPalette, textColor, disabledControlTextColor)
};
#undef MAC_PALETTE_ENTRY
static const int mac_widget_colors_count = sizeof(mac_widget_colors) / sizeof(mac_widget_colors[0]);
static QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
{
QHash<QPlatformTheme::Palette, QPalette*> palettes;
QColor qc;
for (int i = 0; i < mac_widget_colors_count; i++) {
QPalette &pal = *qt_mac_createSystemPalette();
if (mac_widget_colors[i].active) {
qc = qt_mac_toQColor(mac_widget_colors[i].active);
pal.setColor(QPalette::Active, QPalette::Text, qc);
pal.setColor(QPalette::Inactive, QPalette::Text, qc);
pal.setColor(QPalette::Active, QPalette::WindowText, qc);
pal.setColor(QPalette::Inactive, QPalette::WindowText, qc);
pal.setColor(QPalette::Active, QPalette::HighlightedText, qc);
pal.setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
pal.setColor(QPalette::Active, QPalette::ButtonText, qc);
pal.setColor(QPalette::Inactive, QPalette::ButtonText, qc);
qc = qt_mac_toQColor(mac_widget_colors[i].inactive);
pal.setColor(QPalette::Disabled, QPalette::Text, qc);
pal.setColor(QPalette::Disabled, QPalette::WindowText, qc);
pal.setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
pal.setColor(QPalette::Disabled, QPalette::ButtonText, qc);
}
if (mac_widget_colors[i].paletteRole == QPlatformTheme::MenuPalette
|| mac_widget_colors[i].paletteRole == QPlatformTheme::MenuBarPalette) {
NSColor *selectedMenuItemColor = nil;
if (__builtin_available(macOS 10.14, *)) {
// Cheap approximation for NSVisualEffectView (see deprecation note for selectedMenuItemTextColor)
selectedMenuItemColor = [[NSColor selectedContentBackgroundColor] highlightWithLevel:0.4];
} else {
// selectedMenuItemColor would presumably be the correct color to use as the background
// for selected menu items. But that color is always blue, and doesn't follow the
// appearance color in system preferences. So we therefore deliberatly choose to use
// keyboardFocusIndicatorColor instead, which appears to have the same color value.
selectedMenuItemColor = [NSColor keyboardFocusIndicatorColor];
}
pal.setBrush(QPalette::Highlight, qt_mac_toQColor(selectedMenuItemColor));
qc = qt_mac_toQColor([NSColor labelColor]);
pal.setBrush(QPalette::ButtonText, qc);
pal.setBrush(QPalette::Text, qc);
qc = qt_mac_toQColor([NSColor selectedMenuItemTextColor]);
pal.setBrush(QPalette::HighlightedText, qc);
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
pal.setBrush(QPalette::Disabled, QPalette::Text, qc);
} else if ((mac_widget_colors[i].paletteRole == QPlatformTheme::ButtonPalette)
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::HeaderPalette)
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::TabBarPalette)) {
pal.setColor(QPalette::Disabled, QPalette::ButtonText,
pal.color(QPalette::Disabled, QPalette::Text));
pal.setColor(QPalette::Inactive, QPalette::ButtonText,
pal.color(QPalette::Inactive, QPalette::Text));
pal.setColor(QPalette::Active, QPalette::ButtonText,
pal.color(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::ItemViewPalette) {
NSArray<NSColor *> *baseColors = nil;
NSColor *activeHighlightColor = nil;
if (__builtin_available(macOS 10.14, *)) {
baseColors = [NSColor alternatingContentBackgroundColors];
activeHighlightColor = [NSColor selectedContentBackgroundColor];
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
qt_mac_toQBrush([NSColor unemphasizedSelectedTextColor]));
} else {
baseColors = [NSColor controlAlternatingRowBackgroundColors];
activeHighlightColor = [NSColor alternateSelectedControlColor];
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
pal.brush(QPalette::Active, QPalette::Text));
}
pal.setBrush(QPalette::Base, qt_mac_toQBrush(baseColors[0]));
pal.setBrush(QPalette::AlternateBase, qt_mac_toQBrush(baseColors[1]));
pal.setBrush(QPalette::Active, QPalette::Highlight,
qt_mac_toQBrush(activeHighlightColor));
pal.setBrush(QPalette::Active, QPalette::HighlightedText,
qt_mac_toQBrush([NSColor alternateSelectedControlTextColor]));
pal.setBrush(QPalette::Inactive, QPalette::Text,
pal.brush(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextEditPalette) {
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
pal.setBrush(QPalette::Inactive, QPalette::Text,
pal.brush(QPalette::Active, QPalette::Text));
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
pal.brush(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextLineEditPalette
|| mac_widget_colors[i].paletteRole == QPlatformTheme::ComboBoxPalette) {
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
pal.setBrush(QPalette::Disabled, QPalette::Base,
pal.brush(QPalette::Active, QPalette::Base));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::LabelPalette) {
qc = qt_mac_toQColor([NSColor labelColor]);
pal.setBrush(QPalette::Inactive, QPalette::ToolTipText, qc);
}
palettes.insert(mac_widget_colors[i].paletteRole, &pal);
}
return palettes;
}
const char *QCocoaTheme::name = "cocoa"; const char *QCocoaTheme::name = "cocoa";
QCocoaTheme::QCocoaTheme() QCocoaTheme::QCocoaTheme()

View File

@ -745,7 +745,11 @@
- (UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset - (UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset
{ {
int p = static_cast<QUITextPosition *>(position).index; int p = static_cast<QUITextPosition *>(position).index;
return [QUITextPosition positionWithIndex:p + offset]; const int posWithIndex = p + offset;
const int textLength = [self currentImeState:Qt::ImSurroundingText].toString().length();
if (posWithIndex < 0 || posWithIndex > textLength)
return nil;
return [QUITextPosition positionWithIndex:posWithIndex];
} }
- (UITextPosition *)positionFromPosition:(UITextPosition *)position inDirection:(UITextLayoutDirection)direction offset:(NSInteger)offset - (UITextPosition *)positionFromPosition:(UITextPosition *)position inDirection:(UITextLayoutDirection)direction offset:(NSInteger)offset

View File

@ -198,7 +198,9 @@ void QWasmClipboard::installEventHandlers(const QString &canvasId)
return; return;
// Fallback path for browsers which do not support direct clipboard access // Fallback path for browsers which do not support direct clipboard access
val canvas = val::global(canvasId.toUtf8().constData()); val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId.toUtf8().constData()));
canvas.call<void>("addEventListener", std::string("cut"), canvas.call<void>("addEventListener", std::string("cut"),
val::module_property("qtClipboardCutTo")); val::module_property("qtClipboardCutTo"));
canvas.call<void>("addEventListener", std::string("copy"), canvas.call<void>("addEventListener", std::string("copy"),

View File

@ -36,6 +36,8 @@
#include <emscripten/emscripten.h> #include <emscripten/emscripten.h>
#include <emscripten/bind.h> #include <emscripten/bind.h>
using namespace emscripten;
void QWasmCursor::changeCursor(QCursor *windowCursor, QWindow *window) void QWasmCursor::changeCursor(QCursor *windowCursor, QWindow *window)
{ {
if (!windowCursor || !window) if (!windowCursor || !window)
@ -54,8 +56,10 @@ void QWasmCursor::changeCursor(QCursor *windowCursor, QWindow *window)
htmlCursorName = "auto"; htmlCursorName = "auto";
// Set cursor on the canvas // Set cursor on the canvas
QString canvasId = QWasmScreen::get(screen)->canvasId(); QByteArray canvasId = QWasmScreen::get(screen)->canvasId().toUtf8();
emscripten::val canvasStyle = emscripten::val::global(canvasId.toUtf8().constData())["style"]; val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId.constData()));
val canvasStyle = canvas["style"];
canvasStyle.set("cursor", emscripten::val(htmlCursorName.constData())); canvasStyle.set("cursor", emscripten::val(htmlCursorName.constData()));
} }

View File

@ -33,6 +33,14 @@
#include <emscripten.h> #include <emscripten.h>
#if (__EMSCRIPTEN_major__ > 1 || __EMSCRIPTEN_minor__ > 38 || __EMSCRIPTEN_minor__ == 38 && __EMSCRIPTEN_tiny__ >= 22)
# define EMSCRIPTEN_HAS_ASYNC_RUN_IN_MAIN_RUNTIME_THREAD
#endif
#ifdef EMSCRIPTEN_HAS_ASYNC_RUN_IN_MAIN_RUNTIME_THREAD
#include <emscripten/threading.h>
#endif
class QWasmEventDispatcherPrivate : public QEventDispatcherUNIXPrivate class QWasmEventDispatcherPrivate : public QEventDispatcherUNIXPrivate
{ {
@ -179,3 +187,18 @@ void QWasmEventDispatcher::doMaintainTimers()
emscripten_async_call(callback, this, toWaitDuration); emscripten_async_call(callback, this, toWaitDuration);
m_currentTargetTime = newTargetTime; m_currentTargetTime = newTargetTime;
} }
void QWasmEventDispatcher::wakeUp()
{
#ifdef EMSCRIPTEN_HAS_ASYNC_RUN_IN_MAIN_RUNTIME_THREAD
if (!emscripten_is_main_runtime_thread())
emscripten_async_run_in_main_runtime_thread_(EM_FUNC_SIG_VI, (void*)(&QWasmEventDispatcher::mainThreadWakeUp), this);
#endif
QEventDispatcherUNIX::wakeUp();
}
void QWasmEventDispatcher::mainThreadWakeUp(void *eventDispatcher)
{
emscripten_resume_main_loop(); // Service possible requestUpdate Calls
static_cast<QWasmEventDispatcher *>(eventDispatcher)->processEvents(QEventLoop::AllEvents);
}

View File

@ -51,6 +51,8 @@ public:
protected: protected:
bool processEvents(QEventLoop::ProcessEventsFlags flags) override; bool processEvents(QEventLoop::ProcessEventsFlags flags) override;
void doMaintainTimers(); void doMaintainTimers();
void wakeUp() override;
static void mainThreadWakeUp(void *eventDispatcher);
private: private:
bool m_hasMainLoop = false; bool m_hasMainLoop = false;

View File

@ -47,9 +47,10 @@
#include <iostream> #include <iostream>
QT_BEGIN_NAMESPACE
using namespace emscripten; using namespace emscripten;
QT_BEGIN_NAMESPACE
typedef struct emkb2qt { typedef struct emkb2qt {
const char *em; const char *em;
unsigned int qt; unsigned int qt;
@ -353,10 +354,11 @@ void QWasmEventTranslator::initEventHandlers()
g_useNaturalScrolling = false; // make this !default on macOS g_useNaturalScrolling = false; // make this !default on macOS
if (emscripten::val::global("window")["safari"].isUndefined()) { if (emscripten::val::global("window")["safari"].isUndefined()) {
val document = val::global("document");
emscripten::val::global(canvasId).call<void>("addEventListener", val canvas = document.call<val>("getElementById", val(canvasId));
std::string("wheel"), canvas.call<void>("addEventListener",
val::module_property("qtMouseWheelEvent")); std::string("wheel"),
val::module_property("qtMouseWheelEvent"));
} }
} }

View File

@ -106,7 +106,7 @@ EMSCRIPTEN_WEBGL_CONTEXT_HANDLE QWasmOpenGLContext::createEmscriptenContext(cons
attributes.depth = useDepthStencil; attributes.depth = useDepthStencil;
attributes.stencil = useDepthStencil; attributes.stencil = useDepthStencil;
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(canvasId.toLocal8Bit().constData(), &attributes); EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(canvasId.toUtf8().constData(), &attributes);
return context; return context;
} }

View File

@ -44,6 +44,7 @@
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#include <private/qhighdpiscaling_p.h> #include <private/qhighdpiscaling_p.h>
using namespace emscripten;
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -182,13 +183,15 @@ void QWasmScreen::updateQScreenAndCanvasRenderSize()
QSizeF cssSize(css_width, css_height); QSizeF cssSize(css_width, css_height);
QSizeF canvasSize = cssSize * devicePixelRatio(); QSizeF canvasSize = cssSize * devicePixelRatio();
emscripten::val canvas = emscripten::val::global(canvasId.constData()); val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId.constData()));
canvas.set("width", canvasSize.width()); canvas.set("width", canvasSize.width());
canvas.set("height", canvasSize.height()); canvas.set("height", canvasSize.height());
QPoint offset; QPoint offset;
offset.setX(emscripten::val::global(canvasId.constData())["offsetTop"].as<int>()); offset.setX(canvas["offsetTop"].as<int>());
offset.setY(emscripten::val::global(canvasId.constData())["offsetLeft"].as<int>()); offset.setY(canvas["offsetLeft"].as<int>());
emscripten::val rect = canvas.call<emscripten::val>("getBoundingClientRect"); emscripten::val rect = canvas.call<emscripten::val>("getBoundingClientRect");
QPoint position(rect["left"].as<int>() - offset.x(), rect["top"].as<int>() - offset.y()); QPoint position(rect["left"].as<int>() - offset.x(), rect["top"].as<int>() - offset.y());

View File

@ -107,6 +107,9 @@ private:
ULONG m_ref; ULONG m_ref;
}; };
// Clang does not consider __declspec(nothrow) as nothrow
QT_WARNING_DISABLE_CLANG("-Wmicrosoft-exception-spec")
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QWINDOWSCOMBASE_H #endif // QWINDOWSCOMBASE_H

View File

@ -604,15 +604,12 @@ QString QWindowsContext::registerWindowClass(QString cname,
// each one has to have window class names with a unique name // each one has to have window class names with a unique name
// The first instance gets the unmodified name; if the class // The first instance gets the unmodified name; if the class
// has already been registered by another instance of Qt then // has already been registered by another instance of Qt then
// add a UUID. // add a UUID. The check needs to be performed for each name
static int classExists = -1; // in case new message windows are added (QTBUG-81347).
const auto appInstance = static_cast<HINSTANCE>(GetModuleHandle(nullptr)); const auto appInstance = static_cast<HINSTANCE>(GetModuleHandle(nullptr));
if (classExists == -1) { WNDCLASS wcinfo;
WNDCLASS wcinfo; const bool classExists = GetClassInfo(appInstance, reinterpret_cast<LPCWSTR>(cname.utf16()), &wcinfo) == TRUE
classExists = GetClassInfo(appInstance, reinterpret_cast<LPCWSTR>(cname.utf16()), &wcinfo); && wcinfo.lpfnWndProc != proc;
classExists = classExists && wcinfo.lpfnWndProc != proc;
}
if (classExists) if (classExists)
cname += QUuid::createUuid().toString(); cname += QUuid::createUuid().toString();

View File

@ -52,6 +52,8 @@
#include <qpa/qplatformintegration.h> #include <qpa/qplatformintegration.h>
#include <QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h> #include <QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h>
#include <QtCore/private/qwinregistry_p.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
using namespace QWindowsUiAutomation; using namespace QWindowsUiAutomation;
@ -85,12 +87,63 @@ bool QWindowsUiaAccessibility::handleWmGetObject(HWND hwnd, WPARAM wParam, LPARA
return false; return false;
} }
// Retrieve sound name by checking the icon property of a message box
// should it be the event object.
static QString alertSound(const QObject *object)
{
if (object->inherits("QMessageBox")) {
enum MessageBoxIcon { // Keep in sync with QMessageBox::Icon
Information = 1,
Warning = 2,
Critical = 3
};
switch (object->property("icon").toInt()) {
case Information:
return QStringLiteral("SystemAsterisk");
case Warning:
return QStringLiteral("SystemExclamation");
case Critical:
return QStringLiteral("SystemHand");
}
}
return QStringLiteral("SystemAsterisk");
}
static QString soundFileName(const QString &soundName)
{
const QString key = QStringLiteral("AppEvents\\Schemes\\Apps\\.Default\\")
+ soundName + QStringLiteral("\\.Current");
return QWinRegistryKey(HKEY_CURRENT_USER, key).stringValue(L"");
}
static void playSystemSound(const QString &soundName)
{
if (!soundName.isEmpty() && !soundFileName(soundName).isEmpty()) {
PlaySound(reinterpret_cast<const wchar_t *>(soundName.utf16()), nullptr,
SND_ALIAS | SND_ASYNC | SND_NODEFAULT | SND_NOWAIT);
}
}
// Handles accessibility update notifications. // Handles accessibility update notifications.
void QWindowsUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) void QWindowsUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
{ {
if (!event) if (!event)
return; return;
switch (event->type()) {
case QAccessible::PopupMenuStart:
playSystemSound(QStringLiteral("MenuPopup"));
break;
case QAccessible::MenuCommand:
playSystemSound(QStringLiteral("MenuCommand"));
break;
case QAccessible::Alert:
playSystemSound(alertSound(event->object()));
break;
default:
break;
}
QAccessibleInterface *accessible = event->accessibleInterface(); QAccessibleInterface *accessible = event->accessibleInterface();
if (!isActive() || !accessible || !accessible->isValid()) if (!isActive() || !accessible || !accessible->isValid())
return; return;

View File

@ -270,7 +270,7 @@
When side-effects are unavoidable, ensure that the prior state is restored When side-effects are unavoidable, ensure that the prior state is restored
at the end of the test function, even if the test fails. This commonly at the end of the test function, even if the test fails. This commonly
requires use of an RAII (resource acquisition is initialization) class requires use of an RAII (resource acquisition is initialization) class
that restores state when the function returns, or a \l cleanup() method. that restores state when the function returns, or a \c cleanup() method.
Do not simply put the restoration code at the end of the test. If part of Do not simply put the restoration code at the end of the test. If part of
the test fails, such code will be skipped and the prior state will not be the test fails, such code will be skipped and the prior state will not be
restored. restored.

View File

@ -102,9 +102,9 @@
\since 5.14 \since 5.14
Constructs a new QSignalSpy that listens for emissions of the \a signal Constructs a new QSignalSpy that listens for emissions of the \a signal
from the QObject \a object. If QSignalSpy is not able to listen for a from the QObject \a obj. If QSignalSpy is not able to listen for a
valid signal (for example, because \a object is \nullptr or \a signal does valid signal (for example, because \a obj is \nullptr or \a signal does
not denote a valid signal of \a object), an explanatory warning message not denote a valid signal of \a obj), an explanatory warning message
will be output using qWarning() and subsequent calls to \c isValid() will will be output using qWarning() and subsequent calls to \c isValid() will
return false. return false.

View File

@ -416,6 +416,7 @@ Options parseOptions()
} else if (argument.compare(QLatin1String("--aab"), Qt::CaseInsensitive) == 0) { } else if (argument.compare(QLatin1String("--aab"), Qt::CaseInsensitive) == 0) {
options.buildAAB = true; options.buildAAB = true;
options.build = true; options.build = true;
options.jarSigner = true;
} else if (options.buildAAB && argument.compare(QLatin1String("--no-build"), Qt::CaseInsensitive) == 0) { } else if (options.buildAAB && argument.compare(QLatin1String("--no-build"), Qt::CaseInsensitive) == 0) {
options.build = false; options.build = false;
} else if (argument.compare(QLatin1String("--install"), Qt::CaseInsensitive) == 0) { } else if (argument.compare(QLatin1String("--install"), Qt::CaseInsensitive) == 0) {

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the tools applications of the Qt Toolkit. ** This file is part of the tools applications of the Qt Toolkit.
@ -61,7 +61,7 @@ static const char docTypeHeader[] =
#define PROGRAMNAME "qdbuscpp2xml" #define PROGRAMNAME "qdbuscpp2xml"
#define PROGRAMVERSION "0.2" #define PROGRAMVERSION "0.2"
#define PROGRAMCOPYRIGHT "Copyright (C) 2019 The Qt Company Ltd." #define PROGRAMCOPYRIGHT "Copyright (C) 2020 The Qt Company Ltd."
static QString outputFile; static QString outputFile;
static int flags; static int flags;

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the tools applications of the Qt Toolkit. ** This file is part of the tools applications of the Qt Toolkit.
@ -46,7 +46,7 @@
#define PROGRAMNAME "qdbusxml2cpp" #define PROGRAMNAME "qdbusxml2cpp"
#define PROGRAMVERSION "0.8" #define PROGRAMVERSION "0.8"
#define PROGRAMCOPYRIGHT "Copyright (C) 2019 The Qt Company Ltd." #define PROGRAMCOPYRIGHT "Copyright (C) 2020 The Qt Company Ltd."
#define ANNOTATION_NO_WAIT "org.freedesktop.DBus.Method.NoReply" #define ANNOTATION_NO_WAIT "org.freedesktop.DBus.Method.NoReply"

View File

@ -41,7 +41,7 @@ QT_BEGIN_NAMESPACE
static const char *standardImports = static const char *standardImports =
R"I(from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint, R"I(from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
QRect, QSize, QUrl, Qt) QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QFont, from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap, QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
QRadialGradient) QRadialGradient)
from PySide2.QtWidgets import * from PySide2.QtWidgets import *
@ -114,11 +114,29 @@ void WriteImports::acceptCustomWidget(DomCustomWidget *node)
const auto &className = node->elementClass(); const auto &className = node->elementClass();
if (className.contains(QLatin1String("::"))) if (className.contains(QLatin1String("::")))
return; // Exclude namespaced names (just to make tests pass). return; // Exclude namespaced names (just to make tests pass).
const QString &qtModule = qtModuleOf(node); const QString &importModule = qtModuleOf(node);
auto &output = m_uic->output(); auto &output = m_uic->output();
if (!qtModule.isEmpty()) // For starting importing PySide2 modules
output << "from PySide2." << qtModule << ' '; if (!importModule.isEmpty()) {
output << "import " << className << '\n'; output << "from ";
if (importModule.startsWith(QLatin1String("Qt")))
output << "PySide2.";
output << importModule;
if (!className.isEmpty())
output << " import " << className << "\n\n";
} else {
// When the elementHeader is not set, we know it's the continuation
// of a PySide2 import or a normal import of another module.
if (!node->elementHeader() || node->elementHeader()->text().isEmpty()) {
output << "import " << className << '\n';
} else { // When we do have elementHeader, we know it's a relative import.
QString modulePath = node->elementHeader()->text();
// '.h' is added by default on headers for <customwidget>
if (modulePath.endsWith(QLatin1String(".h")))
modulePath.chop(2);
output << "from " << modulePath << " import " << className << '\n';
}
}
} }
} // namespace Python } // namespace Python

View File

@ -2374,7 +2374,8 @@ QList<QUrl> QFileDialog::getOpenFileUrls(QWidget *parent,
This function is used to access local files on Qt for WebAssembly, where the web This function is used to access local files on Qt for WebAssembly, where the web
sandbox places restrictions on how such access may happen. Its implementation will sandbox places restrictions on how such access may happen. Its implementation will
make the browser display a native file dialog, where the user makes the file selection. make the browser display a native file dialog, where the user makes the file selection
based on the parameter \a nameFilter.
It can also be used on other platforms, where it will fall back to using QFileDialog. It can also be used on other platforms, where it will fall back to using QFileDialog.

View File

@ -1214,7 +1214,8 @@ QMimeData *QFileSystemModel::mimeData(const QModelIndexList &indexes) const
/*! /*!
Handles the \a data supplied by a drag and drop operation that ended with Handles the \a data supplied by a drag and drop operation that ended with
the given \a action over the row in the model specified by the \a row and the given \a action over the row in the model specified by the \a row and
\a column and by the \a parent index. \a column and by the \a parent index. Returns true if the operation was
successful.
\sa supportedDropActions() \sa supportedDropActions()
*/ */

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2018 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtWidgets module of the Qt Toolkit. ** This file is part of the QtWidgets module of the Qt Toolkit.
@ -1890,7 +1890,7 @@ void QMessageBox::aboutQt(QWidget *parent, const QString &title)
"<p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p>" "<p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p>"
"<p>Qt is The Qt Company Ltd product developed as an open source " "<p>Qt is The Qt Company Ltd product developed as an open source "
"project. See <a href=\"http://%3/\">%3</a> for more information.</p>" "project. See <a href=\"http://%3/\">%3</a> for more information.</p>"
).arg(QStringLiteral("2019"), ).arg(QStringLiteral("2020"),
QStringLiteral("qt.io/licensing"), QStringLiteral("qt.io/licensing"),
QStringLiteral("qt.io")); QStringLiteral("qt.io"));
QMessageBox *msgBox = new QMessageBox(parent); QMessageBox *msgBox = new QMessageBox(parent);

View File

@ -414,11 +414,9 @@ bool Q_WIDGETS_EXPORT qt_tab_all_widgets()
} }
// ######## move to QApplicationPrivate // ######## move to QApplicationPrivate
// Default application palettes and fonts (per widget type) // Default fonts (per widget type)
Q_GLOBAL_STATIC(PaletteHash, app_palettes)
Q_GLOBAL_STATIC(FontHash, app_fonts) Q_GLOBAL_STATIC(FontHash, app_fonts)
// Exported accessors for use outside of this file // Exported accessor for use outside of this file
PaletteHash *qt_app_palettes_hash() { return app_palettes(); }
FontHash *qt_app_fonts_hash() { return app_fonts(); } FontHash *qt_app_fonts_hash() { return app_fonts(); }
QWidgetList *QApplicationPrivate::popupWidgets = 0; // has keyboard input focus QWidgetList *QApplicationPrivate::popupWidgets = 0; // has keyboard input focus
@ -635,7 +633,7 @@ static void setPossiblePalette(const QPalette *palette, const char *className)
{ {
if (palette == 0) if (palette == 0)
return; return;
QApplicationPrivate::setPalette_helper(*palette, className, false); QApplicationPrivate::setPalette_helper(*palette, className);
} }
void QApplicationPrivate::initializeWidgetPaletteHash() void QApplicationPrivate::initializeWidgetPaletteHash()
@ -643,7 +641,8 @@ void QApplicationPrivate::initializeWidgetPaletteHash()
QPlatformTheme *platformTheme = QGuiApplicationPrivate::platformTheme(); QPlatformTheme *platformTheme = QGuiApplicationPrivate::platformTheme();
if (!platformTheme) if (!platformTheme)
return; return;
app_palettes()->clear();
widgetPalettes.clear();
setPossiblePalette(platformTheme->palette(QPlatformTheme::ToolButtonPalette), "QToolButton"); setPossiblePalette(platformTheme->palette(QPlatformTheme::ToolButtonPalette), "QToolButton");
setPossiblePalette(platformTheme->palette(QPlatformTheme::ButtonPalette), "QAbstractButton"); setPossiblePalette(platformTheme->palette(QPlatformTheme::ButtonPalette), "QAbstractButton");
@ -802,7 +801,7 @@ QApplication::~QApplication()
delete QApplicationPrivate::app_pal; delete QApplicationPrivate::app_pal;
QApplicationPrivate::app_pal = 0; QApplicationPrivate::app_pal = 0;
clearSystemPalette(); clearSystemPalette();
app_palettes()->clear(); QApplicationPrivate::widgetPalettes.clear();
delete QApplicationPrivate::sys_font; delete QApplicationPrivate::sys_font;
QApplicationPrivate::sys_font = 0; QApplicationPrivate::sys_font = 0;
@ -1315,6 +1314,8 @@ void QApplication::setGlobalStrut(const QSize& strut)
QApplicationPrivate::app_strut = strut; QApplicationPrivate::app_strut = strut;
} }
// Widget specific palettes
QApplicationPrivate::PaletteHash QApplicationPrivate::widgetPalettes;
/*! /*!
\fn QPalette QApplication::palette(const QWidget* widget) \fn QPalette QApplication::palette(const QWidget* widget)
@ -1329,15 +1330,13 @@ void QApplication::setGlobalStrut(const QSize& strut)
*/ */
QPalette QApplication::palette(const QWidget* w) QPalette QApplication::palette(const QWidget* w)
{ {
typedef PaletteHash::const_iterator PaletteHashConstIt; auto &widgetPalettes = QApplicationPrivate::widgetPalettes;
if (w && !widgetPalettes.isEmpty()) {
PaletteHash *hash = app_palettes(); auto it = widgetPalettes.constFind(w->metaObject()->className());
if (w && hash && hash->size()) { const auto cend = widgetPalettes.constEnd();
PaletteHashConstIt it = hash->constFind(w->metaObject()->className());
const PaletteHashConstIt cend = hash->constEnd();
if (it != cend) if (it != cend)
return *it; return *it;
for (it = hash->constBegin(); it != cend; ++it) { for (it = widgetPalettes.constBegin(); it != cend; ++it) {
if (w->inherits(it.key())) if (w->inherits(it.key()))
return it.value(); return it.value();
} }
@ -1354,17 +1353,17 @@ QPalette QApplication::palette(const QWidget* w)
*/ */
QPalette QApplication::palette(const char *className) QPalette QApplication::palette(const char *className)
{ {
PaletteHash *hash = app_palettes(); auto &widgetPalettes = QApplicationPrivate::widgetPalettes;
if (className && hash && hash->size()) { if (className && !widgetPalettes.isEmpty()) {
QHash<QByteArray, QPalette>::ConstIterator it = hash->constFind(className); auto it = widgetPalettes.constFind(className);
if (it != hash->constEnd()) if (it != widgetPalettes.constEnd())
return *it; return *it;
} }
return QGuiApplication::palette(); return QGuiApplication::palette();
} }
void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char* className, bool clearWidgetPaletteHash) void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char* className)
{ {
QPalette pal = palette; QPalette pal = palette;
@ -1372,25 +1371,19 @@ void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char*
QApplicationPrivate::app_style->polish(pal); // NB: non-const reference QApplicationPrivate::app_style->polish(pal); // NB: non-const reference
bool all = false; bool all = false;
PaletteHash *hash = app_palettes();
if (!className) { if (!className) {
if (QApplicationPrivate::app_pal && pal.isCopyOf(*QApplicationPrivate::app_pal)) if (!QGuiApplicationPrivate::setPalette(pal))
return; return;
if (!QApplicationPrivate::app_pal)
QApplicationPrivate::app_pal = new QPalette(pal);
else
*QApplicationPrivate::app_pal = pal;
if (!QApplicationPrivate::sys_pal || !palette.isCopyOf(*QApplicationPrivate::sys_pal)) if (!QApplicationPrivate::sys_pal || !palette.isCopyOf(*QApplicationPrivate::sys_pal))
QCoreApplication::setAttribute(Qt::AA_SetPalette); QCoreApplication::setAttribute(Qt::AA_SetPalette);
if (hash && hash->size()) { if (!widgetPalettes.isEmpty()) {
all = true; all = true;
if (clearWidgetPaletteHash) widgetPalettes.clear();
hash->clear();
} }
} else if (hash) { } else {
hash->insert(className, pal); widgetPalettes.insert(className, pal);
} }
if (qApp) if (qApp)
@ -1422,7 +1415,7 @@ void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char*
void QApplication::setPalette(const QPalette &palette, const char* className) void QApplication::setPalette(const QPalette &palette, const char* className)
{ {
QApplicationPrivate::setPalette_helper(palette, className, /*clearWidgetPaletteHash=*/ true); QApplicationPrivate::setPalette_helper(palette, className);
} }

View File

@ -94,9 +94,6 @@ extern QClipboard *qt_clipboard;
typedef QHash<QByteArray, QFont> FontHash; typedef QHash<QByteArray, QFont> FontHash;
Q_WIDGETS_EXPORT FontHash *qt_app_fonts_hash(); Q_WIDGETS_EXPORT FontHash *qt_app_fonts_hash();
typedef QHash<QByteArray, QPalette> PaletteHash;
PaletteHash *qt_app_palettes_hash();
#define QApplicationPrivateBase QGuiApplicationPrivate #define QApplicationPrivateBase QGuiApplicationPrivate
class Q_WIDGETS_EXPORT QApplicationPrivate : public QApplicationPrivateBase class Q_WIDGETS_EXPORT QApplicationPrivate : public QApplicationPrivateBase
@ -188,11 +185,14 @@ public:
static bool widgetCount; // Coupled with -widgetcount switch static bool widgetCount; // Coupled with -widgetcount switch
static void setSystemPalette(const QPalette &pal); static void setSystemPalette(const QPalette &pal);
static void setPalette_helper(const QPalette &palette, const char* className, bool clearWidgetPaletteHash); static void setPalette_helper(const QPalette &palette, const char* className);
static void initializeWidgetPaletteHash(); static void initializeWidgetPaletteHash();
static void initializeWidgetFontHash(); static void initializeWidgetFontHash();
static void setSystemFont(const QFont &font); static void setSystemFont(const QFont &font);
using PaletteHash = QHash<QByteArray, QPalette>;
static PaletteHash widgetPalettes;
static QApplicationPrivate *instance() { return self; } static QApplicationPrivate *instance() { return self; }
#ifdef QT_KEYPAD_NAVIGATION #ifdef QT_KEYPAD_NAVIGATION

View File

@ -475,7 +475,7 @@ QShortcut::QShortcut(QWidget *parent)
match the \a key sequence. Depending on the ambiguity of the match the \a key sequence. Depending on the ambiguity of the
event, the shortcut will call the \a member function, or the \a event, the shortcut will call the \a member function, or the \a
ambiguousMember function, if the key press was in the shortcut's ambiguousMember function, if the key press was in the shortcut's
\a shortcutContext. \a context.
*/ */
QShortcut::QShortcut(const QKeySequence &key, QWidget *parent, QShortcut::QShortcut(const QKeySequence &key, QWidget *parent,
const char *member, const char *ambiguousMember, const char *member, const char *ambiguousMember,

View File

@ -5955,7 +5955,11 @@ void QWidget::setWindowTitle(const QString &title)
has been set, windowIcon() returns the application icon has been set, windowIcon() returns the application icon
(QApplication::windowIcon()). (QApplication::windowIcon()).
\sa windowTitle \note On \macos, window icons represent the active document,
and will not be displayed unless a file path has also been
set using setFilePath.
\sa windowTitle, setFilePath
*/ */
QIcon QWidget::windowIcon() const QIcon QWidget::windowIcon() const
{ {

View File

@ -216,7 +216,7 @@ QDateTimeEdit::~QDateTimeEdit()
/*! /*!
\property QDateTimeEdit::dateTime \property QDateTimeEdit::dateTime
\brief the QDateTime that is set in the QDateTimeEdit \brief The QDateTime that is set in the QDateTimeEdit.
When setting this property the timespec of the QDateTimeEdit remains the same When setting this property the timespec of the QDateTimeEdit remains the same
and the timespec of the new QDateTime is ignored. and the timespec of the new QDateTime is ignored.
@ -253,7 +253,7 @@ void QDateTimeEdit::setDateTime(const QDateTime &datetime)
/*! /*!
\property QDateTimeEdit::date \property QDateTimeEdit::date
\brief the QDate that is set in the widget \brief The QDate that is set in the widget.
By default, this property contains a date that refers to January 1, 2000. By default, this property contains a date that refers to January 1, 2000.
@ -290,7 +290,7 @@ void QDateTimeEdit::setDate(const QDate &date)
/*! /*!
\property QDateTimeEdit::time \property QDateTimeEdit::time
\brief the QTime that is set in the widget \brief The QTime that is set in the widget.
By default, this property contains a time of 00:00:00 and 0 milliseconds. By default, this property contains a time of 00:00:00 and 0 milliseconds.
@ -335,7 +335,8 @@ void QDateTimeEdit::setCalendar(QCalendar calendar)
/*! /*!
\since 4.4 \since 4.4
\property QDateTimeEdit::minimumDateTime \property QDateTimeEdit::minimumDateTime
\brief the minimum datetime of the date time edit
\brief The minimum datetime of the date time edit.
Changing this property implicitly updates the \l minimumDate and \l Changing this property implicitly updates the \l minimumDate and \l
minimumTime properties to the date and time parts of this property, minimumTime properties to the date and time parts of this property,
@ -376,7 +377,7 @@ void QDateTimeEdit::setMinimumDateTime(const QDateTime &dt)
\since 4.4 \since 4.4
\property QDateTimeEdit::maximumDateTime \property QDateTimeEdit::maximumDateTime
\brief the maximum datetime of the date time edit \brief The maximum datetime of the date time edit.
Changing this property implicitly updates the \l maximumDate and \l Changing this property implicitly updates the \l maximumDate and \l
maximumTime properties to the date and time parts of this property, maximumTime properties to the date and time parts of this property,
@ -444,7 +445,7 @@ void QDateTimeEdit::setDateTimeRange(const QDateTime &min, const QDateTime &max)
/*! /*!
\property QDateTimeEdit::minimumDate \property QDateTimeEdit::minimumDate
\brief the minimum date of the date time edit \brief The minimum date of the date time edit.
Changing this property updates the date of the \l minimumDateTime property Changing this property updates the date of the \l minimumDateTime property
while preserving the \l minimumTime property. When setting this property, while preserving the \l minimumTime property. When setting this property,
@ -484,7 +485,7 @@ void QDateTimeEdit::clearMinimumDate()
/*! /*!
\property QDateTimeEdit::maximumDate \property QDateTimeEdit::maximumDate
\brief the maximum date of the date time edit \brief The maximum date of the date time edit.
Changing this property updates the date of the \l maximumDateTime property Changing this property updates the date of the \l maximumDateTime property
while preserving the \l maximumTime property. When setting this property, the while preserving the \l maximumTime property. When setting this property, the
@ -523,7 +524,7 @@ void QDateTimeEdit::clearMaximumDate()
/*! /*!
\property QDateTimeEdit::minimumTime \property QDateTimeEdit::minimumTime
\brief the minimum time of the date time edit \brief The minimum time of the date time edit.
Changing this property updates the time of the \l minimumDateTime property Changing this property updates the time of the \l minimumDateTime property
while preserving the \l minimumDate and \l maximumDate properties. If those while preserving the \l minimumDate and \l maximumDate properties. If those
@ -562,7 +563,7 @@ void QDateTimeEdit::clearMinimumTime()
/*! /*!
\property QDateTimeEdit::maximumTime \property QDateTimeEdit::maximumTime
\brief the maximum time of the date time edit \brief The maximum time of the date time edit.
Changing this property updates the time of the \l maximumDateTime property Changing this property updates the time of the \l maximumDateTime property
while preserving the \l minimumDate and \l maximumDate properties. If those while preserving the \l minimumDate and \l maximumDate properties. If those
@ -665,7 +666,7 @@ void QDateTimeEdit::setTimeRange(const QTime &min, const QTime &max)
/*! /*!
\property QDateTimeEdit::displayedSections \property QDateTimeEdit::displayedSections
\brief the currently displayed fields of the date time edit \brief The currently displayed fields of the date time edit.
Returns a bit set of the displayed sections for this format. Returns a bit set of the displayed sections for this format.
\a setDisplayFormat(), displayFormat() \a setDisplayFormat(), displayFormat()
@ -680,7 +681,7 @@ QDateTimeEdit::Sections QDateTimeEdit::displayedSections() const
/*! /*!
\property QDateTimeEdit::currentSection \property QDateTimeEdit::currentSection
\brief the current section of the spinbox \brief The current section of the spinbox.
\a setCurrentSection() \a setCurrentSection()
*/ */
@ -739,7 +740,7 @@ QDateTimeEdit::Section QDateTimeEdit::sectionAt(int index) const
\property QDateTimeEdit::sectionCount \property QDateTimeEdit::sectionCount
\brief the number of sections displayed. \brief The number of sections displayed.
If the format is 'yyyy/yy/yyyy', sectionCount returns 3 If the format is 'yyyy/yy/yyyy', sectionCount returns 3
*/ */
@ -755,7 +756,7 @@ int QDateTimeEdit::sectionCount() const
\property QDateTimeEdit::currentSectionIndex \property QDateTimeEdit::currentSectionIndex
\brief the current section index of the spinbox \brief The current section index of the spinbox.
If the format is 'yyyy/MM/dd', the displayText is '2001/05/21', and If the format is 'yyyy/MM/dd', the displayText is '2001/05/21', and
the cursorPosition is 5, currentSectionIndex returns 1. If the the cursorPosition is 5, currentSectionIndex returns 1. If the
@ -879,7 +880,7 @@ QString QDateTimeEdit::sectionText(Section section) const
/*! /*!
\property QDateTimeEdit::displayFormat \property QDateTimeEdit::displayFormat
\brief the format used to display the time/date of the date time edit \brief The format used to display the time/date of the date time edit.
This format is described in QDateTime::toString() and QDateTime::fromString() This format is described in QDateTime::toString() and QDateTime::fromString()
@ -951,7 +952,7 @@ void QDateTimeEdit::setDisplayFormat(const QString &format)
/*! /*!
\property QDateTimeEdit::calendarPopup \property QDateTimeEdit::calendarPopup
\brief the current calendar pop-up show mode. \brief The current calendar pop-up show mode.
\since 4.2 \since 4.2
The calendar pop-up will be shown upon clicking the arrow button. The calendar pop-up will be shown upon clicking the arrow button.
@ -983,7 +984,7 @@ void QDateTimeEdit::setCalendarPopup(bool enable)
/*! /*!
\property QDateTimeEdit::timeSpec \property QDateTimeEdit::timeSpec
\brief the current timespec used by the date time edit. \brief The current timespec used by the date time edit.
\since 4.4 \since 4.4
*/ */

View File

@ -497,14 +497,20 @@ bool QScrollBar::event(QEvent *event)
void QScrollBar::wheelEvent(QWheelEvent *event) void QScrollBar::wheelEvent(QWheelEvent *event)
{ {
event->ignore(); event->ignore();
bool horizontal = qAbs(event->angleDelta().x()) > qAbs(event->angleDelta().y());
// The vertical wheel can be used to scroll a horizontal scrollbar, but only if
// there is no simultaneous horizontal wheel movement. This is to avoid chaotic
// scrolling on touchpads.
if (!horizontal && event->angleDelta().x() != 0 && orientation() == Qt::Horizontal)
return;
// scrollbar is a special case - in vertical mode it reaches minimum // scrollbar is a special case - in vertical mode it reaches minimum
// value in the upper position, however QSlider's minimum value is on // value in the upper position, however QSlider's minimum value is on
// the bottom. So we need to invert the value, but since the scrollbar is // the bottom. So we need to invert the value, but since the scrollbar is
// inverted by default, we need to invert the delta value only for the // inverted by default, we need to invert the delta value only for the
// horizontal orientation. // horizontal orientation.
int delta = (orientation() == Qt::Horizontal ? -event->angleDelta().x() : event->angleDelta().y()); int delta = horizontal ? -event->angleDelta().x() : event->angleDelta().y();
Q_D(QScrollBar); Q_D(QScrollBar);
if (d->scrollByDelta(orientation(), event->modifiers(), delta)) if (d->scrollByDelta(horizontal ? Qt::Horizontal : Qt::Vertical, event->modifiers(), delta))
event->accept(); event->accept();
if (event->phase() == Qt::ScrollBegin) if (event->phase() == Qt::ScrollBegin)

View File

@ -823,7 +823,7 @@ void QTextBrowser::setSource(const QUrl &url)
/*! /*!
Attempts to load the document at the given \a url with the specified \a type. Attempts to load the document at the given \a url with the specified \a type.
If \a type is \l {QTextDocument::ResourceType::UnknownResource}{UnknownResource} If \a type is \l {QTextDocument::UnknownResource}{UnknownResource}
(the default), the document type will be detected: that is, if the url ends (the default), the document type will be detected: that is, if the url ends
with an extension of \c{.md}, \c{.mkd} or \c{.markdown}, the document will be with an extension of \c{.md}, \c{.mkd} or \c{.markdown}, the document will be
loaded via \l QTextDocument::setMarkdown(); otherwise it will be loaded via loaded via \l QTextDocument::setMarkdown(); otherwise it will be loaded via

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com> ** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
@ -767,18 +767,18 @@ void tst_qmessagehandler::qMessagePattern_data()
QTest::qWait(10000); QTest::qWait(10000);
QTest::newRow("time") << "/%{time yyyy - MM - d}/%{message}" QTest::newRow("time") << "/%{time yyyy - MM - d}/%{message}"
<< true << (QList<QByteArray>() << true << (QList<QByteArray>()
<< ('/' + QDateTime::currentDateTime().toString("yyyy - MM - d").toUtf8() + "/qDebug")); << ('/' + QDateTime::currentDateTime().toString("yyyy - MM - d").toLocal8Bit() + "/qDebug"));
QTest::newRow("time-time") << "/%{time yyyy - MM - d}/%{time dd-MM-yy}/%{message}" QTest::newRow("time-time") << "/%{time yyyy - MM - d}/%{time dd-MM-yy}/%{message}"
<< true << (QList<QByteArray>() << true << (QList<QByteArray>()
<< ('/' + QDateTime::currentDateTime().toString("yyyy - MM - d").toUtf8() << ('/' + QDateTime::currentDateTime().toString("yyyy - MM - d").toLocal8Bit()
+ '/' + QDateTime::currentDateTime().toString("dd-MM-yy").toUtf8() + '/' + QDateTime::currentDateTime().toString("dd-MM-yy").toLocal8Bit()
+ "/qDebug")); + "/qDebug"));
QTest::newRow("skipped-time-shown-time") QTest::newRow("skipped-time-shown-time")
<< "/%{if-warning}%{time yyyy - MM - d}%{endif}%{if-debug}%{time dd-MM-yy}%{endif}/%{message}" << "/%{if-warning}%{time yyyy - MM - d}%{endif}%{if-debug}%{time dd-MM-yy}%{endif}/%{message}"
<< true << (QList<QByteArray>() << true << (QList<QByteArray>()
<< ('/' + QDateTime::currentDateTime().toString("dd-MM-yy").toUtf8() + "/qDebug")); << ('/' + QDateTime::currentDateTime().toString("dd-MM-yy").toLocal8Bit() + "/qDebug"));
// %{time} should have a padding of 6 so if it takes less than 10 seconds to show // %{time} should have a padding of 6 so if it takes less than 10 seconds to show
// the first message, there should be 5 spaces // the first message, there should be 5 spaces

View File

@ -34,6 +34,9 @@
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QTextStream> #include <QTextStream>
#include <QDir> #include <QDir>
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
#include <windows.h>
#endif
/* All tests need to run in temporary directories not used /* All tests need to run in temporary directories not used
* by the application to avoid non-deterministic failures on Windows * by the application to avoid non-deterministic failures on Windows
@ -79,6 +82,9 @@ private slots:
void signalsEmittedAfterFileMoved(); void signalsEmittedAfterFileMoved();
void watchUnicodeCharacters(); void watchUnicodeCharacters();
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
void watchDirectoryAttributeChanges();
#endif
private: private:
QString m_tempDirPattern; QString m_tempDirPattern;
@ -813,5 +819,27 @@ void tst_QFileSystemWatcher::watchUnicodeCharacters()
QTRY_COMPARE(changedSpy.count(), 1); QTRY_COMPARE(changedSpy.count(), 1);
} }
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
void tst_QFileSystemWatcher::watchDirectoryAttributeChanges()
{
QTemporaryDir temporaryDirectory(m_tempDirPattern);
QVERIFY2(temporaryDirectory.isValid(), qPrintable(temporaryDirectory.errorString()));
QDir testDir(temporaryDirectory.path());
const QString subDir(QString::fromLatin1("attrib_test"));
QVERIFY(testDir.mkdir(subDir));
testDir = QDir(temporaryDirectory.path() + QDir::separator() + subDir);
QFileSystemWatcher watcher;
QVERIFY(watcher.addPath(temporaryDirectory.path()));
FileSystemWatcherSpy changedSpy(&watcher, FileSystemWatcherSpy::SpyOnDirectoryChanged);
QCOMPARE(changedSpy.count(), 0);
QVERIFY(SetFileAttributes(reinterpret_cast<LPCWSTR>(testDir.absolutePath().utf16()), FILE_ATTRIBUTE_HIDDEN) != 0);
QTRY_COMPARE(changedSpy.count(), 1);
QVERIFY(SetFileAttributes(reinterpret_cast<LPCWSTR>(testDir.absolutePath().utf16()), FILE_ATTRIBUTE_NORMAL) != 0);
QTRY_COMPARE(changedSpy.count(), 2);
}
#endif
QTEST_MAIN(tst_QFileSystemWatcher) QTEST_MAIN(tst_QFileSystemWatcher)
#include "tst_qfilesystemwatcher.moc" #include "tst_qfilesystemwatcher.moc"

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the test suite of the Qt Toolkit. ** This file is part of the test suite of the Qt Toolkit.
@ -65,7 +65,7 @@ void tst_QNoDebug::noDebugOutput() const
void tst_QNoDebug::streaming() const void tst_QNoDebug::streaming() const
{ {
QDateTime dt(QDate(1,2,3),QTime(4,5,6)); QDateTime dt(QDate(1,2,3),QTime(4,5,6));
const QByteArray debugString = dt.toString(u"yyyy-MM-dd HH:mm:ss.zzz t").toLatin1(); const QByteArray debugString = dt.toString(u"yyyy-MM-dd HH:mm:ss.zzz t").toLocal8Bit();
const QByteArray message = "QDateTime(" + debugString + " Qt::LocalTime)"; const QByteArray message = "QDateTime(" + debugString + " Qt::LocalTime)";
QTest::ignoreMessage(QtWarningMsg, message.constData()); QTest::ignoreMessage(QtWarningMsg, message.constData());
qWarning() << dt; qWarning() << dt;

View File

@ -6719,16 +6719,16 @@ void tst_QObject::connectWarnings()
ReceiverObject r1; ReceiverObject r1;
r1.reset(); r1.reset();
QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, ReceiverObject): invalid null parameter"); QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, ReceiverObject): invalid nullptr parameter");
connect(static_cast<const SenderObject *>(nullptr), &SubSender::signal1, &r1, &ReceiverObject::slot1); connect(static_cast<const SenderObject *>(nullptr), &SubSender::signal1, &r1, &ReceiverObject::slot1);
QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SubSender, Unknown): invalid null parameter"); QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SubSender, Unknown): invalid nullptr parameter");
connect(&sub, &SubSender::signal1, static_cast<ReceiverObject *>(nullptr), &ReceiverObject::slot1); connect(&sub, &SubSender::signal1, static_cast<ReceiverObject *>(nullptr), &ReceiverObject::slot1);
QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, ReceiverObject): invalid null parameter"); QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, ReceiverObject): invalid nullptr parameter");
connect(static_cast<const SenderObject *>(nullptr), &SenderObject::signal1, &r1, &ReceiverObject::slot1); connect(static_cast<const SenderObject *>(nullptr), &SenderObject::signal1, &r1, &ReceiverObject::slot1);
QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, Unknown): invalid null parameter"); QTest::ignoreMessage(QtWarningMsg, "QObject::connect(SenderObject, Unknown): invalid nullptr parameter");
connect(&obj, &SenderObject::signal1, static_cast<ReceiverObject *>(nullptr), &ReceiverObject::slot1); connect(&obj, &SenderObject::signal1, static_cast<ReceiverObject *>(nullptr), &ReceiverObject::slot1);
} }

View File

@ -459,8 +459,8 @@ private slots:
void trimmed(); void trimmed();
void toUpper(); void toUpper();
void toLower(); void toLower();
void isUpper(); void isLower_isUpper_data();
void isLower(); void isLower_isUpper();
void toCaseFolded(); void toCaseFolded();
void rightJustified(); void rightJustified();
void leftJustified(); void leftJustified();
@ -2311,44 +2311,83 @@ void tst_QString::toLower()
#endif // icu #endif // icu
} }
void tst_QString::isUpper() void tst_QString::isLower_isUpper_data()
{ {
QVERIFY(!QString().isUpper()); QTest::addColumn<QString>("string");
QVERIFY(!QString("").isUpper()); QTest::addColumn<bool>("isLower");
QVERIFY(QString("TEXT").isUpper()); QTest::addColumn<bool>("isUpper");
QVERIFY(!QString("text").isUpper());
QVERIFY(!QString("Text").isUpper()); int row = 0;
QVERIFY(!QString("tExt").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString() << true << true;
QVERIFY(!QString("teXt").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("") << true << true;
QVERIFY(!QString("texT").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString(" ") << true << true;
QVERIFY(!QString("TExt").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("123") << true << true;
QVERIFY(!QString("teXT").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("@123$#") << true << true;
QVERIFY(!QString("tEXt").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("𝄞𝄴𝆏♫") << true << true; // Unicode Block 'Musical Symbols'
QVERIFY(!QString("tExT").isUpper()); // not foldable
QVERIFY(!QString("@ABYZ[").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("𝚊𝚋𝚌𝚍𝚎") << true << true; // MATHEMATICAL MONOSPACE SMALL A, ... E
QVERIFY(!QString("@abyz[").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("𝙖,𝙗,𝙘,𝙙,𝙚") << true << true; // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A, ... E
QVERIFY(!QString("`ABYZ{").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("𝗔𝗕𝗖𝗗𝗘") << true << true; // MATHEMATICAL SANS-SERIF BOLD CAPITAL A, ... E
QVERIFY(!QString("`abyz{").isUpper()); QTest::addRow("lower-and-upper-%02d", row++) << QString("𝐀,𝐁,𝐂,𝐃,𝐄") << true << true; // MATHEMATICAL BOLD CAPITAL A, ... E
row = 0;
QTest::addRow("only-lower-%02d", row++) << QString("text") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("àaa") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("øæß") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("text ") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString(" text") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("hello, world!") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("123@abyz[") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("`abyz{") << true << false;
QTest::addRow("only-lower-%02d", row++) << QString("a𝙖a|b𝙗b|c𝙘c|d𝙙d|e𝙚e") << true << false; // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A, ... E
QTest::addRow("only-lower-%02d", row++) << QString("𐐨") << true << false; // DESERET SMALL LETTER LONG I
// uppercase letters, not foldable
QTest::addRow("only-lower-%02d", row++) << QString("text𝗔text") << true << false; // MATHEMATICAL SANS-SERIF BOLD CAPITAL A
row = 0;
QTest::addRow("only-upper-%02d", row++) << QString("TEXT") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("ÀAA") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("ØÆẞ") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("TEXT ") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString(" TEXT") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("HELLO, WORLD!") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("123@ABYZ[") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("`ABYZ{") << false << true;
QTest::addRow("only-upper-%02d", row++) << QString("A𝐀A|B𝐁B|C𝐂C|D𝐃D|E𝐄E") << false << true; // MATHEMATICAL BOLD CAPITAL A, ... E
QTest::addRow("only-upper-%02d", row++) << QString("𐐀") << false << true; // DESERET CAPITAL LETTER LONG I
// lowercase letters, not foldable
QTest::addRow("only-upper-%02d", row++) << QString("TEXT𝚊TEXT") << false << true; // MATHEMATICAL MONOSPACE SMALL A
row = 0;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("Text") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("tExt") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("teXt") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("texT") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("TExt") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("teXT") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("tEXt") << false << false;
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("tExT") << false << false;
// not foldable
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("TEXT𝚊text") << false << false; // MATHEMATICAL MONOSPACE SMALL A
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("text𝗔TEXT") << false << false; // MATHEMATICAL SANS-SERIF BOLD CAPITAL A
// titlecase, foldable
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("abcLjdef") << false << false; // LATIN CAPITAL LETTER L WITH SMALL LETTER J
QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("ABCLjDEF") << false << false; // LATIN CAPITAL LETTER L WITH SMALL LETTER J
} }
void tst_QString::isLower() void tst_QString::isLower_isUpper()
{ {
QVERIFY(!QString().isLower()); QFETCH(QString, string);
QVERIFY(!QString("").isLower()); QFETCH(bool, isLower);
QVERIFY(QString("text").isLower()); QFETCH(bool, isUpper);
QVERIFY(!QString("Text").isLower());
QVERIFY(!QString("tExt").isLower()); QCOMPARE(string.isLower(), isLower);
QVERIFY(!QString("teXt").isLower()); QCOMPARE(string.toLower() == string, isLower);
QVERIFY(!QString("texT").isLower()); QVERIFY(string.toLower().isLower());
QVERIFY(!QString("TExt").isLower());
QVERIFY(!QString("teXT").isLower()); QCOMPARE(string.isUpper(), isUpper);
QVERIFY(!QString("tEXt").isLower()); QCOMPARE(string.toUpper() == string, isUpper);
QVERIFY(!QString("tExT").isLower()); QVERIFY(string.toUpper().isUpper());
QVERIFY(!QString("TEXT").isLower());
QVERIFY(!QString("@ABYZ[").isLower());
QVERIFY(!QString("@abyz[").isLower());
QVERIFY(!QString("`ABYZ{").isLower());
QVERIFY(!QString("`abyz{").isLower());
} }
void tst_QString::toCaseFolded() void tst_QString::toCaseFolded()

View File

@ -88,7 +88,7 @@ private slots:
void toStringDateFormat(); void toStringDateFormat();
void isLeapYear(); void isLeapYear();
void yearsZeroToNinetyNine(); void yearsZeroToNinetyNine();
void negativeYear() const; void printNegativeYear_data() const;
void printNegativeYear() const; void printNegativeYear() const;
void roundtripGermanLocale() const; void roundtripGermanLocale() const;
#if QT_CONFIG(textdate) && QT_DEPRECATED_SINCE(5, 10) #if QT_CONFIG(textdate) && QT_DEPRECATED_SINCE(5, 10)
@ -1458,33 +1458,28 @@ void tst_QDate::yearsZeroToNinetyNine()
} }
} }
void tst_QDate::printNegativeYear_data() const
void tst_QDate::negativeYear() const
{ {
QDate y(-20, 3, 4); QTest::addColumn<int>("year");
QVERIFY(y.isValid()); QTest::addColumn<QString>("expect");
QCOMPARE(y.year(), -20); QTest::newRow("millennium") << -1000 << QStringLiteral("-1000");
QTest::newRow("century") << -500 << QStringLiteral("-0500");
QTest::newRow("decade") << -20 << QStringLiteral("-0020");
QTest::newRow("year") << -7 << QStringLiteral("-0007");
} }
void tst_QDate::printNegativeYear() const void tst_QDate::printNegativeYear() const
{ {
{ QFETCH(int, year);
QDate date(-500, 3, 4); QFETCH(QString, expect);
QVERIFY(date.isValid()); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QCOMPARE(date.toString(QLatin1String("yyyy")), QString::fromLatin1("-0500")); expect.replace(QLatin1Char('-'), QLocale().negativeSign());
} #endif
{ QDate date(year, 3, 4);
QDate date(-10, 3, 4); QVERIFY(date.isValid());
QVERIFY(date.isValid()); QCOMPARE(date.year(), year);
QCOMPARE(date.toString(QLatin1String("yyyy")), QString::fromLatin1("-0010")); QCOMPARE(date.toString(QLatin1String("yyyy")), expect);
}
{
QDate date(-2, 3, 4);
QVERIFY(date.isValid());
QCOMPARE(date.toString(QLatin1String("yyyy")), QString::fromLatin1("-0002"));
}
} }
void tst_QDate::roundtripGermanLocale() const void tst_QDate::roundtripGermanLocale() const

View File

@ -55,12 +55,13 @@ private slots:
void thematicBreaks(); void thematicBreaks();
void lists_data(); void lists_data();
void lists(); void lists();
void avoidBlankLineAtBeginning_data();
void avoidBlankLineAtBeginning();
}; };
void tst_QTextMarkdownImporter::headingBulletsContinuations() void tst_QTextMarkdownImporter::headingBulletsContinuations()
{ {
const QStringList expectedBlocks = QStringList() << const QStringList expectedBlocks = QStringList() <<
"" << // we could do without this blank line before the heading, but currently it happens
"heading" << "heading" <<
"bullet 1 continuation line 1, indented via tab" << "bullet 1 continuation line 1, indented via tab" <<
"bullet 2 continuation line 2, indented via 4 spaces" << "bullet 2 continuation line 2, indented via 4 spaces" <<
@ -222,5 +223,38 @@ void tst_QTextMarkdownImporter::lists()
QCOMPARE(doc.toMarkdown(), rewrite); QCOMPARE(doc.toMarkdown(), rewrite);
} }
void tst_QTextMarkdownImporter::avoidBlankLineAtBeginning_data()
{
QTest::addColumn<QString>("input");
QTest::addColumn<int>("expectedNumberOfParagraphs");
QTest::newRow("Text block") << QString("Markdown text") << 1;
QTest::newRow("Headline") << QString("Markdown text\n============") << 1;
QTest::newRow("Code block") << QString(" Markdown text") << 2;
QTest::newRow("Unordered list") << QString("* Markdown text") << 1;
QTest::newRow("Ordered list") << QString("1. Markdown text") << 1;
QTest::newRow("Blockquote") << QString("> Markdown text") << 1;
}
void tst_QTextMarkdownImporter::avoidBlankLineAtBeginning() // QTBUG-81060
{
QFETCH(QString, input);
QFETCH(int, expectedNumberOfParagraphs);
QTextDocument doc;
QTextMarkdownImporter(QTextMarkdownImporter::DialectGitHub).import(&doc, input);
QTextFrame::iterator iterator = doc.rootFrame()->begin();
int i = 0;
while (!iterator.atEnd()) {
QTextBlock block = iterator.currentBlock();
// Make sure there is no empty paragraph at the beginning of the document
if (i == 0)
QVERIFY(!block.text().isEmpty());
++iterator;
++i;
}
QCOMPARE(i, expectedNumberOfParagraphs);
}
QTEST_MAIN(tst_QTextMarkdownImporter) QTEST_MAIN(tst_QTextMarkdownImporter)
#include "tst_qtextmarkdownimporter.moc" #include "tst_qtextmarkdownimporter.moc"

View File

@ -215,7 +215,8 @@ void tst_QFtp::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::socksProxyServerName(), 1080)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::socksProxyServerName(), 1080));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3128)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3128));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif #endif
#ifndef QT_NO_BEARERMANAGEMENT #ifndef QT_NO_BEARERMANAGEMENT
QNetworkConfigurationManager manager; QNetworkConfigurationManager manager;

View File

@ -105,7 +105,8 @@ void tst_QHttpNetworkConnection::initTestCase()
#if defined(QT_TEST_SERVER) #if defined(QT_TEST_SERVER)
QVERIFY(QtNetworkSettings::verifyConnection(httpServerName(), 80)); QVERIFY(QtNetworkSettings::verifyConnection(httpServerName(), 80));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif #endif
} }

View File

@ -100,7 +100,8 @@ tst_Spdy::~tst_Spdy()
void tst_Spdy::initTestCase() void tst_Spdy::initTestCase()
{ {
QVERIFY(!m_rfc3252FilePath.isEmpty()); QVERIFY(!m_rfc3252FilePath.isEmpty());
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
} }
void tst_Spdy::settingsAndNegotiation_data() void tst_Spdy::settingsAndNegotiation_data()

View File

@ -1,5 +1,6 @@
TEMPLATE=subdirs TEMPLATE=subdirs
SUBDIRS=\ SUBDIRS=\
selftest \
access \ access \
bearer \ bearer \
kernel \ kernel \

View File

@ -0,0 +1,6 @@
CONFIG += testcase
TARGET = tst_networkselftest
SOURCES += tst_networkselftest.cpp
requires(qtConfig(private_tests))
QT = core network network-private testlib

View File

@ -0,0 +1,55 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtTest/QtTest>
#include "../../network-settings.h"
class tst_NetworkSelftest : public QObject
{
Q_OBJECT
private slots:
void testServerIsAvailableInCI();
};
void tst_NetworkSelftest::testServerIsAvailableInCI()
{
if (!qEnvironmentVariable("QTEST_ENVIRONMENT").split(' ').contains("ci"))
QSKIP("Not running in the CI");
#if !defined(QT_TEST_SERVER)
QVERIFY2(QtNetworkSettings::verifyTestNetworkSettings(),
"Test server must be available when running in the CI");
#endif
}
QTEST_MAIN(tst_NetworkSelftest)
#include "tst_networkselftest.moc"

View File

@ -87,7 +87,8 @@ private slots:
void tst_PlatformSocketEngine::initTestCase() void tst_PlatformSocketEngine::initTestCase()
{ {
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -129,7 +129,8 @@ void tst_QHttpSocketEngine::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpServerName(), 80)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpServerName(), 80));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 143)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 143));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif #endif
} }

View File

@ -142,7 +142,8 @@ void tst_QSocks5SocketEngine::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpServerName(), 80)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpServerName(), 80));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 143)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 143));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif #endif
} }

View File

@ -358,7 +358,8 @@ void tst_QTcpSocket::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::ftpServerName(), 21)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::ftpServerName(), 21));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::ftpProxyServerName(), 2121)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::ftpProxyServerName(), 2121));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif #endif
} }

View File

@ -391,7 +391,8 @@ void tst_QSslSocket::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 993)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 993));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::echoServerName(), 13)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::echoServerName(), 13));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif // QT_TEST_SERVER #endif // QT_TEST_SERVER
#endif // QT_NO_SSL #endif // QT_NO_SSL
} }

View File

@ -109,7 +109,8 @@ void tst_QSslSocket_onDemandCertificates_member::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3129)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3129));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3130)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3130));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif // QT_TEST_SERVER #endif // QT_TEST_SERVER
} }

View File

@ -105,7 +105,8 @@ void tst_QSslSocket_onDemandCertificates_static::initTestCase()
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3129)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3129));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3130)); QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpProxyServerName(), 3130));
#else #else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); if (!QtNetworkSettings::verifyTestNetworkSettings())
QSKIP("No network test server available");
#endif // QT_TEST_SERVER #endif // QT_TEST_SERVER
} }

View File

@ -38,12 +38,12 @@
from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint, from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
QRect, QSize, QUrl, Qt) QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QFont, from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap, QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
QRadialGradient) QRadialGradient)
from PySide2.QtWidgets import * from PySide2.QtWidgets import *
import GammaView from gammaview import GammaView
class Ui_Config(object): class Ui_Config(object):

View File

@ -1,3 +1,5 @@
[moveCursorBiggerJump] [moveCursorBiggerJump]
osx osx
[mouseWheel:scroll down per pixel]
macos

Some files were not shown because too many files have changed in this diff Show More