Merge remote-tracking branch 'origin/5.5.0' into 5.5

Conflicts:
	src/plugins/platforms/cocoa/qcocoafiledialoghelper.h

Manually fixed src/testlib/qtestcase.cpp to return the right type.

Change-Id: Id1634dbe3d73fefe9431b9f5378846cb187624e4
This commit is contained in:
Liang Qi 2015-06-26 16:20:21 +02:00
commit 4dd8a63fc1
60 changed files with 1030 additions and 366 deletions

2
configure vendored
View File

@ -2697,6 +2697,8 @@ MacOS/iOS options:
link tools against those frameworks. link tools against those frameworks.
-no-framework ...... Do not build Qt as a series of frameworks. -no-framework ...... Do not build Qt as a series of frameworks.
-secure-transport .. Use SecureTransport instead of OpenSSL (requires -no-openssl)
-sdk <sdk> ......... Build Qt using Apple provided SDK <sdk>. The argument should be -sdk <sdk> ......... Build Qt using Apple provided SDK <sdk>. The argument should be
one of the available SDKs as listed by 'xcodebuild -showsdks'. one of the available SDKs as listed by 'xcodebuild -showsdks'.
Note that the argument applies only to Qt libraries and applications built Note that the argument applies only to Qt libraries and applications built

619
dist/changes-5.5.0 vendored Normal file
View File

@ -0,0 +1,619 @@
Qt 5.5 introduces many new features and improvements as well as bugfixes
over the 5.4.x series. For more details, refer to the online documentation
included in this distribution. The documentation is also available online:
http://doc.qt.io/qt-5.5
The Qt version 5.5 series is binary compatible with the 5.4.x series.
Applications compiled for 5.4 will continue to run with 5.5.
Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:
http://bugreports.qt.io/
Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
****************************************************************************
* Deprecation Notice *
****************************************************************************
- Support for the following platforms or toolchains is deprecated in Qt
5.5 and will be removed as of Qt 5.6:
* Apple OS X builds using GNU libstdc++
* BlackBerry 10
* QNX 6.5
The following platforms or toolchains are deprecated and will be
removed as of Qt 5.7:
* Apple OS X 10.7 (Lion)
* GNU Compiler Collection (GCC) versions 4.6 and earlier
* Microsoft Visual Studio compiler versions 2008 and 2010
* Microsoft Windows XP, Windows Vista
* Microsoft Windows Embedded Compact 7
Deprecated platforms and toolchains continue to work until removed.
- The QtWebKit and QtQuick1 modules and support for the QML 1 language
are deprecated and Qt 5.5 will be the last release to include
them. Starting with Qt 5.6, the source code for those modules will
not be included in Qt's packaging. Compiling the 5.5 release of
QtWebKit modules along with Qt 5.6 or future versions should
work. QtQuick1 is not guaranteed to work in future versions after
Qt 5.6.
- The QtScript module is deprecated and will be removed from Qt's
packaging starting with version 5.7. The 5.5 and 5.6 releases of
QtScript should continue to work along with Qt 5.7 and future
versions.
- [QTBUG-25121] The usage of the QStyleOptionProgressBar::orientation
member has been deprecated.
- QLibraryInfo::buildDate() was deprecated and will return a constant
date now.
****************************************************************************
* Future Direction Notice *
****************************************************************************
- In Qt 6, QCoreApplication::notify() will not be called for events being
delivered to objects outside the main thread. The reason for that is
that the main application object may begin destruction while those
threads are still delivering events, which is undefined behavior.
Applications that currently override notify() and use that function
outside the main thread are advised to find other solutions in the mean
time.
- Qt 5.7 will begin requiring certain C++11 features in order to
compile. The minimum compiler versions for that release will be:
* Clang 3.2 (included in XCode 5.0)
* GCC 4.7
* Intel C++ Composer XE 2013 SP1 (compiler version 14.0)
* Microsoft Visual Studio 2012 (compiler version 17.0)
****************************************************************************
* Important Behavior Changes *
****************************************************************************
- Q_ASSERT will now expand the condition even in release mode when asserts
are disabled, albeit in an unreachable code path. This solves compiler
warnings about variables and functions that were unused in release mode
because they were only used in assertions. Unfortunately, codebases that
hid those functions and variables via #ifndef will need to remove the
conditionals to compile with Qt 5.5.
- QDBusConnection::sender() (deprecated since Qt 4.3) has changed to
always return an invalid QDBusConnection. To know what connection the
incoming call was received from, use QDBusContext.
- QHostAddress will no longer convert IPv6 addresses of type "v4-mapped"
to IPv4. To perform this conversion manually, construct another
QHostAddress with the result of toIPv4Address().
- (DY)LD_LIBRARY_PATH will no longer "stick" in the process environment
when starting a QProcess. This means that if a QProcess is started with
a clear environment, it will not specially inherit (DY)LD_LIBRARY_PATH
from the parent process. This should not affect most applications, but
if the old behavior is desired, one can simply pass a clear
QProcessEnvironment with the (DY)LD_LIBRARY_PATH values added, to the
QProcess.
- QAbstractTableModel and QAbstractListModel now reimplement sibling()
to avoid calling parent() (which returns a constant). Subclasses of
these models that override parent(), will likely also need to
override sibling() now.
- Qt 5.5 received some header #include cleanups. Code that relied on indirect
includes from Qt headers may need to include some headers explicitly now.
For example, qstringlist.h no longer includes QDataStream and QObject.
- QCoreApplication:
* [QTBUG-30330][QTSOLBUG-184] On Windows, QCoreApplication::arguments()
now returns a list built from argv on Windows as well if a modified
argv was passed to the class' constructor.
- QIODevice:
* Opening Android assets with QIODevice::ReadWrite now returns false to
correctly indicate that the files are not writable.
- QItemDelegate:
* [QTBUG-3305] QItemDelegate will now not close a
QTextEdit/QPlainTextEdit editor when the tab key is pressed; instead,
the key will reach the editor.
- QProgressDialog:
* [QTBUG-17427][QTBUG-25316] The timer for estimating the duration of
the progress dialog is now started in the constructor and in
setValue(minimum()), as well as when calling setValue(0), as
previously documented.
- QSaveFile:
* [QTBUG-44086] Files created by QSaveFile do now have the same
rights as files created by QFile. This also fixes a regression in
QSettings: In the Qt 5.4 series, new files created by QSettings
were only readable by the current user.
- QVariant:
* [QTBUG-42722] QVariant now obeys the C++ type promotion rules when
comparing numeric types (integrals, float and double), including the
fact that unsigned comparisons are preferred for types of the same
rank (that is, now QVariant(-1) > QVariant(0U)).
- QWindow:
* QWindows will no longer be re-shown automatically when moved from a
destroyed QScreen, unless that QScreen was a virtual sibling of the
primary screen.
- qmake:
* For commercial builds, qmake now checks for a valid Qt license. This
requires setting up a Qt Account (or .qt-license file) on the
development machine.
* Qt configure and qmake used with a MinGW spec will no longer emulate
MSVC by picking up the INCLUDE and LIB environment variables. Use the
-I/-L configure options to pass additional paths, as you would under
Unix.
* A lot of quoting issues have been fixed. As a side effect, qmake
has become more sensitive to over-quoted file names in project
files.
* qmake is now stricter about syntax errors in project files.
****************************************************************************
* Library *
****************************************************************************
QtCore
------
- Added qEnvironmentVariableIntValue().
- Added Q_DECL_RELAXED_CONSTEXPR for the corresponding C++14 feature
- Added qHashRange() and qHashRangeCommutative() functions to aid
implementing qHash() overloads for custom types.
- Q_ENUMS and Q_FLAGS have been deprecated, and replaced by Q_ENUM and
Q_FLAG macros. These two new macros automatically register the enum with
the Qt metatype system, allowing automatic conversion to or from string
in QVariant, or to show the strings by QDebug operators. They also
enable the new QMetaEnum::fromType function.
- QPersistentModel index becomes an built-in meta-type, including QVariant
support.
- Updated Unicode data to v.7.0
- Updated QLocale data to CLDR v.27
- Updated QTimeZone data to CLDR v.27
- Item Models:
* QItemSelectionModel can now be created without a model and have one
set later.
- Logging:
* QtInfoMsg got added as a new QtMsgType. Use the new qInfo(), qCInfo()
macros to log to it.
- Logging framework:
* %{threadid} now prints the real thread ID. On Linux, OS X, iOS,
FreeBSD and Windows, the value is unique system-wide. On other
systems, it will print something that may be process-specific (the
value of pthread_self(3)). To print the pointer to QThread::current(),
use %{qthreadptr}.
- moc
* Classes annotated with Q_GADGET can now have Q_PROPERTY and Q_INVOKABLE
functions. QMetaProperty::{read,write}OnGadget and
QMetaMethod::invokeOnGadget can be used with those.
- Objective-C:
* [QTBUG-37116] Added NSDate/CDateRef converters for QDateTime
- QAssociativeIterable:
* Added find().
- QCommandLineParser:
* Message boxes are used to display errors and usage if no console
window can be obtained on Windows.
- QDebug:
* Printing of QStrings and QStringRefs whenever "noquote" is not active
now prints the strings in a format that can be copied back to C++
code. All characters that aren't printable in US-ASCII are escaped
(this includes printable Unicode characters outside of US-ASCII).
Pretty-printing will not respect QTextFormat padding or field widths.
* Similarly, printing of QByteArrays whenever "noquote" is not active now
prints the arrays in a format consumable in C++, with all non-printable
characters printed in hex escape sequences.
- QJsonObject:
* Added conversion to and from QVariantHash
- QLibrary:
* Added DeepBindHint which maps to RTLD_DEEPBIND on Linux making it
possible to load libraries with external symbols that clash with
already loaded ones, such as plugins linked to Qt4.
- QLockFile:
* [QTBUG-45497] Detection of stale lock files got more robust and takes
the name of the process that belongs to the stored PID into account.
- QRegularExpression:
* Support for matching using QStringRef as the subject's string type has
been added.
- QSet:
* Can now be used as the key in QSet and QHash.
- QSortFilterProxyModel:
* [QTBUG-35440] QSortFilterProxyModel now properly forwards the roles
that have been changed when the source model emits dataChanged().
- QStandardPaths:
* [QTBUG-38872][QTBUG-38845] Added QStandardPaths::AppConfigLocation,
for application-specific configuration directory. ConfigLocation was
inconsistent.
- QString:
* Added support for retrieving the QRegularExpressionMatch to indexOf
and lastIndexOf.
* Added QT_RESTRICTED_CAST_FROM_ASCII macro as less intrusive
alternative to QT_NO_CAST_FROM_ASCII.
* Added methods for convenient conversion to and from std::u16string and
std::u32string.
* Added asprintf(), vasprintf().
- QThreadPool:
* Added QThreadPool::cancel() which allows removing from the job queue a
job that hasn't been started yet.
- QTimeZone:
* Added methods systemTimeZone() and utc() that return QTimeZone objects
for the system time zone and for UTC, respectively.
- QVector:
* Added QVector::append(const QVector &) overload
- QVector3D:
* Added convenience project and unproject methods to use like gluProject
and gluUnproject
- QtMath:
* qmath.h no longer includes math.h, so any sources depending on that
indirect inclusion may fail to build.
- State Machine:
* Added support for internal transitions.
* [QTBUG-40293] Added an addTransition() overload that takes a
pointer-to-member for the signal triggering the transition.
* [QTBUG-44963] Fixed an issue where a history state restore would
activate too many states, possibly putting the state machine in an
invalid state.
* QTBUG-44783] Fixed an issue where the state machine could end up in
an invalid state when transitions from a parallel state were not
checked for conflicts.
* Fixed a case where a parallel state was not exited and re-entered
when one of its substates was exited and subsequently re-entered.
* Fixed the non-deterministic behavior of picking a transition from a
set of conflicting transitions.
QtDBus
------
- Added annotation org.qtproject.QtDBus.MethodName to allow
autogenerating C++ methods with different names to the original DBus
method
QtGui
-----
- Added support for device-specific backend plugins in eglfs.
- eglfs is now using fullscreen mode also when running on X11.
- Added a plugin to get mouse, keyboard and touch events via libinput.
- The linuxfb platform plugin's input device handling is now compatible
with eglfs. The evdev keyboard, mouse and touch code is compiled in by
default.
- The mouse cursor on Embedded Linux is now handling hotplugging correctly
with eglfs and linuxfb regardless of how the input handling code is
loaded (via a generic plugin or built in to the platform plugin).
- QOffscreenSurface is now relying on EGL_KHR_surfaceless_context when
available, and avoids creating a pbuffer surface when the extension is
present.
- initializeOpenGLFunctions() no longer needs to be called when querying a
versioned function wrapper object via QOpenGLContext::versionFunctions().
- Added version function classes for OpenGL 4.4 and 4.5 and deprecate some
erroneously classified functions.
- Exposed TabFocusBehavior in QStyleHints
- [QTBUG-42240][QTBUG-43263] Qt now contains a built-in GPU driver
blacklist for Windows that disables the usage of desktop OpenGL with
some older cards that are known to be unstable with opengl32.dll.
- [QTBUG-44937] Support for QScreen::grabWindow() is now available on
embedded platforms (eglfs, linuxfb).
- Added QStyleHints::singleClickActivation to access whether the platform
expects item activation to occur on single clicks rather than double
clicks.
- [QTBUG-40034] QOpenGLWidget and QQuickWidget are now supported on iOS.
- Accessibility:
* [QTBUG-44479] Qt now reports text attributes correctly on Linux, so
ORCA+F now works properly in QTextEdit and other text controls.
- Accessibility / OS X:
* QTextEdit now properly reports to accessibility visual lines
(softlines) as lines, instead of whole paragraphs. This allows better
VoiceOver user experience when reading text line by line using arrows
up/down.
* Visual bounds returned by QTextEdit were singificantly improved; this
enables VoiceOver to draw properly positioned VoiceOver cursor.
- Image plugins:
* [QTBUG-37946][QTBUG-43563][QTBUG-45552][QTBUG-45865] An option has
been added to QImageReader to enable automatic application of EXIF
orientation. This behavior was default in Qt 5.4.1, but reverted in Qt
5.4.2.
- QFontDatabase:
* Added QFontDatabase::isPrivateFamily()
- QImage:
* Added support for grayscale and alpha 8-bit formats which can also be
rendered to.
- QPainter:
* [QTBUG-35830] QPainter will no longer try to replace IntersectClip
with ReplaceClip if the paint engine is a QPicture.
- QPlatformSurfaceEvent:
* [QTBUG-42476][QTBUG-42483] Added event class QPlatformSurfaceEvent,
which is sent to QWindow and QOffscreenSurface when native surface is
created or about to be destroyed.
- QQuaternion:
* Added methods to convert a quaternion to/from Euler angles and to/from
rotation matrix.
- QScreen:
* Added devicePixelRatio property.
- QTextDocument:
* Support for searching with a QRegularExpression in a document has been
added.
- QWheelEvent:
* On OSX, trackpad wheel event phase transitions now occur in the order
ScrollBegin, ScrollUpdate, ..., ScrollEnd, ScrollUpdate, ...,
ScrollEnd, where the second batch of updates represents momentum
events (inertial scrolling).
- QWindow:
* [QTBUG-32956] lastWindowClosed will now be emitted even if
quitOnLastWindowClosed is not set.
- Windows:
* [QTBUG-43263] Introduced experimental feature allowing the user to
specify a GPU driver buglist with some additional keywords to chooose
the GL renderer backend depending on GPU.
- i18n:
* [QTBUG-43447] Fixed bug where layout direction did not switch
according to the instruction in the translation file.
- Text:
* [QTBUG-39286] Fixed position of underline on centered text when the
text layout's width is an even number.
QtNetwork
---------
- [QTBUG-26295] Introduced libproxy backend for Unix platforms, enabled
automatically if the required dev package is present
- As some legacy ifdefs for OpenSSL 0.9.7 and 0.9.8f were removed, Qt
will no longer build with these versions. In addition, there is no
longer support for an OpenSSL library built with NO_TLSEXT.
- [QTBUG-26538] Fixed a bug that caused both QTcpSocket and QUdpSocket to
close the socket and lose any bound ports before connecting. Now
bind()/setSocketDescriptor() followed by connect() will retain the
original file descriptor.
- QLocalSocket:
* [QTBUG-16688] On Windows, waitForReadyRead now always waits for more
data, even if bytes are still in the buffer.
- QNetworkAccessManager:
* It is now possible to use TLS PSK ciphersuites when using HTTPS (or
similar protocols working over SSL).
- QSslSocket:
* [QTBUG-39077] It is now possible to use TLS PSK ciphersuites in client
sockets.
* A new SSL backend for iOS and OS X, implemented with Apple's Secure
Transport (Security Framework).
- SSL/TLS support:
* [QTBUG-18972] It is now possible to parse elliptic curve certificates.
* It is now possible to choose which elliptic curves should be used by
an elliptic curve cipher.
QtTest
------
- QCOMPARE now pretty-prints QSizePolicy{,::Policy,::ControlType{,s}}.
- QtTest now prints an escaped version of QByteArrays that failed to
compare with QCOMPARE, instead of the hex dump.
- QTest::toString() can now be overloaded (instead of just specialized)
for custom types, and is now reliably found through argument-dependent
lookup (ADL).
QtWidgets
---------
- Added QPlainTextEdit::createStandardContextMenu(QPoint) overload that
takes the position in document coordinates. This method enables the
actions that are sensitive to the given position eg. where the user
clicked.
- Accessibility / OS X:
* VoiceOver users of QTextEdit can now use mouse and touch exploration
on trackpad to point at text to have spoken to them.
- Layouts:
* [QTBUG-43099] Fixed a bug where spans sometimes didn't distribute
themselves to the last cells they covered.
- QAbstractItemView:
* Added iconSizeChanged signal.
- QAbstractScrollArea:
* [QTBUG-8315] A getter for the viewport margins has been added.
- QComboBox:
* A QComboBox does not reset itself any more when setting the same model
more than once.
* [QTBUG-43350] QComboBox will now reset its root model index when a new
model is set on it.
- QHeaderView:
* [QTBUG-21201] Auto-scroll the view when making extended row/column
selections.
* Default section size is now style-dependent by default.
* Added resetDefaultSectionSize().
- QMenu:
* [QTBUG-20094] QMenu now pick up how "sloppy" submenus behave from the
style.
- QOpenGLWidget:
* [QTBUG-40717] Added an UpdateBehavior flag to QOpenGLWidget and
enabled support for NoParitalUpdate for QOpenGLWidget. NoPartialUpdate
is the default update behavior for QOpenGLWidget.
- QSizePolicy:
* QSizePolicy::ControlTypes is now introspectable through QSizePolicy's
meta object.
- QToolButton:
* [QTBUG-23396] Fixed the double removal of ampersands.
- QTreeWidget:
* [QTBUG-40060] Restored Qt 5.1 behavior of QTreeWidgetItems with
ItemIsTristate to enable automatic management of the check state.
User-editable tristate checkboxes are now enabled by setting the new
flag ItemIsUserTristate.
****************************************************************************
* Platform Specific Changes *
****************************************************************************
- Removed BlackBerry PlayBook support.
Android
-------
- [QTBUG-43705] Fixed canonical path for nonexistent paths on some
devices.
- [QTBUG-38700] On devices with translucent system UI, Qt's windows are now
positioned to avoid overlapping it. This behavior can be
overridden in the application's AndroidManifest.xml.
- [QTBUG-45430] Fixed a bug that caused applications not to be resumable
after user changed language in system settings.
- QtCore / QTimeZone:
* [QTBUG-35908] Android timezones are now available in QTimeZone.
- QtWidgets:
* Enable QDockWidget window decorations.
- The QtDBus module is now disabled by default.
- Added support for arm64-v8a, x86_64, and mips64 with gcc 4.9.
OS X
----
- [QTBUG-43999] QApplication::setWindowIcon now changes the icon for the
application in the dock.
- Text:
* [QTBUG-44708] Fixed appending text with a different writing system and
formatting to a latin ligature.
Windows
-------
- QMimeData:
* [QTBUG-17373] Added support for handling dropping of multiple mail
attachments, adding ;index=N to the mimetype string
application/x-qt-windows-mime;value="FileContents"
- Text:
* [QTBUG-44501] Fixed design metrics for text
X11/XCB
-------
- GLX and EGL code paths are now dynamically resolved, making it possible
for one build of a plugin to use both code paths. The default is to use
the GLX code path if available. This can be overridden by specifying
QT_XCB_GL_INTEGRATION=xcb_egl as an environment variable. Enable the
logging category qt.xcb.glintegration.debug to get debug log output of
what integration is used.
- [QTBUG-31762] QSystemTrayIcon now uses StatusNotifier D-Bus protocol
when the desktop environment supports it
- [QTBUG-40174][QTBUG-42985] If all QScreens (xcb outputs) are
disconnected while an application is running,
QGuiApplication::primaryScreen() will now return null until a screen is
connected again.
****************************************************************************
* Compiler Specific Changes *
****************************************************************************
- Qt 5.5 now unconditionally uses the "using" keyword. Compilers that do
not support this keyword are deprecated and will not be able to build
Qt. Previous versions of Qt may or may not compile, as no testing was
done to ensure it worked.
- Visual Studio: -Zm200 (an option to specify the precompiled header
memory allocation limit) is not added anymore by qmake to the compiler
calls. If you encounter an C1076 compiler error you might need to re-add
it in your .pro file.
****************************************************************************
* Tools *
****************************************************************************
configure & build system
------------------------
- Added support for VS2015.
- [QTBUG-31814][OS X/iOS] Qt is now built with a relative RPATH.
- [VS2012+] Qt is now always built with C++11 with these compilers.
- [Windows] Added -static-runtime option.
- Added support for GCC/Clang -fsanitize= options.
- Enabled tslib autodetection by default.
- Added configure-time check for IPC support.
- [QTBUG-44690][QNX] Fixed NEON detection when cross-compiling on Windows.
- On-device compilation should work better on RaspPi and some other
devices now (use linux-g++ mkspec).
- configure -redo and config.status support spaces in arguments now.
- Qt can be now built in and installed to directories with spaces.
Note that source directories with spaces are still not supported.
qmake
-----
- [QTBUG-3069][Linux] Building with -rpath will now create DT_RUNPATH tags
instead of DT_RPATH, allowing LD_LIBRARY_PATH to override the rpath.
- [QTBUG-41917][VS] Fixed project generation when PRECOMPILED_SOURCE is
in a different directory than PRECOMPILED_HEADER.
- [QTBUG-42454][MinGW] Added handling of QMAKE_MANIFEST.
- [QTBUG-13496][MSVC] CONFIG+=no_batch is now automatically added when
multiple sources with the same base name exist.
- Added $$[QT_INSTALL_PREFIX/dev], etc. properties which reflect the
on-device locations of Qt (the -prefix, etc. passed to configure).
- Building under MSys is less problematic now.
- [QTBUG-37269] Fixed cross-compilation for Unix on Windows/MinGW.
- [QTBUG-8202][QTBUG-20566][QTBUG-44685] Fixed distclean targets.
- [QTBUG-43162][VS] Added DISTFILES support for Visual Studio projects.
- [QTBUG-41753][VS][WinPhone] Fixed MdilXapCompile deployment step.
- [QTBUG-44960][VS] Reworked .dll deployment. Added $$QMAKE_DLL_PATHS.
- [QTBUG-44823][MSVC] Fixed unreasonable values being passed in /VERSION.
Added $$VERSION_PE_HEADER to override the value.
- [WinRT] The icon handling was reworked/extended.
- [QTBUG-12711] Fixed infinite recursion on malformed .prl files.
****************************************************************************
* Third-party libraries *
****************************************************************************
- [QTBUG-44815][QTBUG-37660][QTBUG-44694][QTBUG-42443] ANGLE was updated
to Chromium branch 2356 (2.1~99f075dade7c).

View File

@ -42,15 +42,16 @@ manifestmeta.highlighted.names = "QtQuick/Qt Quick Demo - Same Game" \
"QtQuick/Qt Quick Demo - StocQt" \ "QtQuick/Qt Quick Demo - StocQt" \
"QtQuick/Qt Quick Demo - Clocks" \ "QtQuick/Qt Quick Demo - Clocks" \
"QtQuick/Qt Quick Examples - Shader Effects" \ "QtQuick/Qt Quick Examples - Shader Effects" \
"QtQuick/Qt Quick Examples - Text" \ "QtQuickExtras/Qt Quick Extras - Dashboard" \
"QtQuick/Qt Quick Examples - Window and Screen" \ "QtQuickExtras/Qt Quick Extras - Gallery" \
"QtQuickControls/Qt Quick Controls - Gallery" \ "QtQuickControls/Qt Quick Controls - Gallery" \
"QtQuickControls/Qt Quick Controls - Text Editor Example" \ "QtQuickControls/Qt Quick Controls - Text Editor Example" \
"QtQuickControls/Qt Quick Controls - Table View Example" \ "QtQuickControls/Qt Quick Controls - Table View Example" \
"QtQuickControls/Qt Quick Controls - Calendar Example" \ "QtQuickControls/Qt Quick Controls - Calendar Example" \
"QtQuickDialogs/Qt Quick System Dialog Examples" \ "QtQuickDialogs/Qt Quick System Dialog Examples" \
"QtWidgets/Application Example" \ "QtWinExtras/Quick Player" \
"QtWinExtras/Quick Player" "QtMultimedia/QML Video Shader Effects Example" \
"QtCanvas3D/Planets Example"
manifestmeta.highlighted.attributes = isHighlighted:true manifestmeta.highlighted.attributes = isHighlighted:true
@ -269,12 +270,9 @@ manifestmeta.thumbnail.names = "QtCore/Contiguous Cache Example" \
"QtWidgets/Event Transitions Example" \ "QtWidgets/Event Transitions Example" \
"QtWidgets/Two-way Button Example" \ "QtWidgets/Two-way Button Example" \
"QtWidgets/Validators Example" \ "QtWidgets/Validators Example" \
"ActiveQt/*" \
"QtDbus/*" \ "QtDbus/*" \
"QtHelp/*" \ "QtHelp/*" \
"QtMultimedia/AudioEngine Example" \ "QtMultimedia/AudioEngine Example" \
"QtMultimedia/Declarative Radio Example" \
"QtMultimediaWidgets/Media Player Example" \
"QtQml/Extending QML*" \ "QtQml/Extending QML*" \
"QtQuick/Qt Quick Examples - Accessibility" \ "QtQuick/Qt Quick Examples - Accessibility" \
"QtSensors/Qt Sensors - SensorGesture QML Type example" \ "QtSensors/Qt Sensors - SensorGesture QML Type example" \

View File

@ -40,15 +40,13 @@ qt:!isEmpty(QT_CONFIG) {
# libraries. This applies only to apps, since all loaded libraries inherit # libraries. This applies only to apps, since all loaded libraries inherit
# rpaths from current process executable. # rpaths from current process executable.
else:!if(host_build:force_bootstrap):equals(TEMPLATE, app):!defined(QMAKE_RPATHDIR, var):contains(QT_CONFIG, rpath) { else:!if(host_build:force_bootstrap):equals(TEMPLATE, app):!defined(QMAKE_RPATHDIR, var):contains(QT_CONFIG, rpath) {
# If app is outside of Qt SDK prefix use absolute path to Qt libraries, # If app is expected to be installed into the Qt prefix build, use
# otherwise make it relative, so all SDK tools and examples work when # relative path, so all SDK tools and examples work when relocated.
# relocated. prefix_build:defined(target.path, var):\
# Tests are an exception, since they are launched in their build not contains(target.path, "$$re_escape($$[QT_INSTALL_PREFIX])/.*"):\
# install location by CI, so we cannot use relative rpaths there. # Tests are an exception, since they are launched in their build not
if(!contains(target.path, "$$re_escape($$[QT_INSTALL_PREFIX])/.*")|\ # install location by CI, so we cannot use relative rpaths there.
contains(target.path, "$$re_escape($$[QT_INSTALL_TESTS])/.*")) { !contains(target.path, "$$re_escape($$[QT_INSTALL_TESTS])/.*") {
QMAKE_RPATHDIR = $$[QT_INSTALL_LIBS]
} else {
app_bundle { app_bundle {
ios: binpath = $$target.path/$${TARGET}.app ios: binpath = $$target.path/$${TARGET}.app
else: binpath = $$target.path/$${TARGET}.app/Contents/MacOS else: binpath = $$target.path/$${TARGET}.app/Contents/MacOS
@ -57,6 +55,9 @@ qt:!isEmpty(QT_CONFIG) {
} }
QMAKE_RPATHDIR = @loader_path/$$relative_path($$[QT_INSTALL_LIBS], $$binpath) QMAKE_RPATHDIR = @loader_path/$$relative_path($$[QT_INSTALL_LIBS], $$binpath)
unset(binpath) unset(binpath)
} else {
# Otherwise, use absolute path to Qt libraries
QMAKE_RPATHDIR = $$[QT_INSTALL_LIBS]
} }
} }
} }

View File

@ -1408,6 +1408,10 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
QMap<QString, QString> settings; QMap<QString, QString> settings;
settings.insert("COPY_PHASE_STRIP", (as_release ? "YES" : "NO")); settings.insert("COPY_PHASE_STRIP", (as_release ? "YES" : "NO"));
// Bitcode is only supported with a deployment target >= iOS 6.0.
// Disable it for now, and consider switching it on when later
// bumping the deployment target.
settings.insert("ENABLE_BITCODE", "NO");
settings.insert("GCC_GENERATE_DEBUGGING_SYMBOLS", as_release ? "NO" : "YES"); settings.insert("GCC_GENERATE_DEBUGGING_SYMBOLS", as_release ? "NO" : "YES");
if(!as_release) if(!as_release)
settings.insert("GCC_OPTIMIZATION_LEVEL", "0"); settings.insert("GCC_OPTIMIZATION_LEVEL", "0");

View File

@ -2238,6 +2238,8 @@ void VCFilter::modifyPCHstage(QString str)
CompilerTool.UsePrecompiledHeader = (isCFile ? pchNone : pchCreateUsingSpecific); CompilerTool.UsePrecompiledHeader = (isCFile ? pchNone : pchCreateUsingSpecific);
if (isCFile) if (isCFile)
CompilerTool.PrecompiledHeaderThrough = QLatin1String("$(NOINHERIT)"); CompilerTool.PrecompiledHeaderThrough = QLatin1String("$(NOINHERIT)");
else if (autogenSourceFile)
CompilerTool.PrecompiledHeaderThrough = Project->precompHFilename;
CompilerTool.ForcedIncludeFiles = QStringList("$(NOINHERIT)"); CompilerTool.ForcedIncludeFiles = QStringList("$(NOINHERIT)");
} }

View File

@ -49,7 +49,7 @@ INSTALLS += qmake
#licheck #licheck
licheck.path = $$[QT_HOST_BINS] licheck.path = $$[QT_HOST_BINS]
licheck.files = $$PWD/bin/$$QT_LICHECK licheck.files = $$PWD/bin/$$QT_LICHECK
exists($$licheck.files): INSTALLS += licheck !isEmpty(QT_LICHECK): INSTALLS += licheck
#syncqt #syncqt
syncqt.path = $$[QT_HOST_BINS] syncqt.path = $$[QT_HOST_BINS]

View File

@ -107,10 +107,6 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
if (m_manager.isEnabled()) if (m_manager.isEnabled())
accServiceListener.onAccessibilityStateChanged(true); accServiceListener.onAccessibilityStateChanged(true);
} }
// Enable Qt Accessibility so that notifications are enabled
QtNativeAccessibility.setActive(true);
} }
private class AccessibilityManagerListener implements AccessibilityManager.AccessibilityStateChangeListener private class AccessibilityManagerListener implements AccessibilityManager.AccessibilityStateChangeListener
@ -119,8 +115,6 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
public void onAccessibilityStateChanged(boolean enabled) public void onAccessibilityStateChanged(boolean enabled)
{ {
if (enabled) { if (enabled) {
// The accessibility code depends on android API level 16, so dynamically resolve it
if (android.os.Build.VERSION.SDK_INT >= 16) {
try { try {
View view = m_view; View view = m_view;
if (view == null) { if (view == null) {
@ -147,13 +141,14 @@ public class QtAccessibilityDelegate extends View.AccessibilityDelegate
// Unknown exception means something went wrong. // Unknown exception means something went wrong.
Log.w("Qt A11y", "Unknown exception: " + e.toString()); Log.w("Qt A11y", "Unknown exception: " + e.toString());
} }
}
} else { } else {
if (m_view != null) { if (m_view != null) {
m_layout.removeView(m_view); m_layout.removeView(m_view);
m_view = null; m_view = null;
} }
} }
QtNativeAccessibility.setActive(enabled);
} }
} }

View File

@ -794,23 +794,6 @@ public class QtActivityDelegate
m_surfaces = new HashMap<Integer, QtSurface>(); m_surfaces = new HashMap<Integer, QtSurface>();
m_nativeViews = new HashMap<Integer, View>(); m_nativeViews = new HashMap<Integer, View>();
m_activity.registerForContextMenu(m_layout); m_activity.registerForContextMenu(m_layout);
// Initialize accessibility
try {
final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate";
Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName);
Constructor constructor = qtDelegateClass.getConstructor(android.app.Activity.class,
android.view.ViewGroup.class,
this.getClass());
Object accessibilityDelegate = constructor.newInstance(m_activity, m_layout, this);
} catch (ClassNotFoundException e) {
// Class not found is fine since we are compatible with Android API < 16, but the function will
// only be available with that API level.
} catch (Exception e) {
// Unknown exception means something went wrong.
Log.w("Qt A11y", "Unknown exception: " + e.toString());
}
m_activity.setContentView(m_layout, m_activity.setContentView(m_layout,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)); ViewGroup.LayoutParams.MATCH_PARENT));
@ -828,6 +811,25 @@ public class QtActivityDelegate
m_currentRotation = rotation; m_currentRotation = rotation;
} }
public void initializeAccessibility()
{
// Initialize accessibility
try {
final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate";
Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName);
Constructor constructor = qtDelegateClass.getConstructor(android.app.Activity.class,
android.view.ViewGroup.class,
this.getClass());
Object accessibilityDelegate = constructor.newInstance(m_activity, m_layout, this);
} catch (ClassNotFoundException e) {
// Class not found is fine since we are compatible with Android API < 16, but the function will
// only be available with that API level.
} catch (Exception e) {
// Unknown exception means something went wrong.
Log.w("Qt A11y", "Unknown exception: " + e.toString());
}
}
public void onConfigurationChanged(Configuration configuration) public void onConfigurationChanged(Configuration configuration)
{ {
try { try {

View File

@ -571,6 +571,16 @@ public class QtNative
}); });
} }
private static void initializeAccessibility()
{
runAction(new Runnable() {
@Override
public void run() {
m_activityDelegate.initializeAccessibility();
}
});
}
// screen methods // screen methods
public static native void setDisplayMetrics(int screenWidthPixels, public static native void setDisplayMetrics(int screenWidthPixels,
int screenHeightPixels, int screenHeightPixels,

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto"> <manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --"> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation"
android:name="org.qtproject.qt5.android.bindings.QtActivity" android:name="org.qtproject.qt5.android.bindings.QtActivity"
android:label="-- %%INSERT_APP_NAME%% --" android:label="-- %%INSERT_APP_NAME%% --"
android:screenOrientation="unspecified" android:screenOrientation="unspecified"

View File

@ -51,7 +51,7 @@ if (data.open(QFile::WriteOnly | QFile::Truncate)) {
//! [1] //! [1]
QTextStream stream(stdin); QTextStream stream(stdin);
QString line; QString line;
while (stream.readLine(&line)) { while (stream.readLineInto(&line)) {
... ...
} }
//! [1] //! [1]

View File

@ -155,7 +155,9 @@
/* Clang also masquerades as GCC */ /* Clang also masquerades as GCC */
# if defined(__apple_build_version__) # if defined(__apple_build_version__)
# /* http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions */ # /* http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions */
# if __apple_build_version__ >= 6000051 # if __apple_build_version__ >= 6020049
# define Q_CC_CLANG 306
# elif __apple_build_version__ >= 6000051
# define Q_CC_CLANG 305 # define Q_CC_CLANG 305
# elif __apple_build_version__ >= 5030038 # elif __apple_build_version__ >= 5030038
# define Q_CC_CLANG 304 # define Q_CC_CLANG 304
@ -616,7 +618,7 @@
# if __has_feature(cxx_strong_enums) # if __has_feature(cxx_strong_enums)
# define Q_COMPILER_CLASS_ENUM # define Q_COMPILER_CLASS_ENUM
# endif # endif
# if __has_feature(cxx_constexpr) # if __has_feature(cxx_constexpr) && Q_CC_CLANG > 302 /* CLANG 3.2 has bad/partial support */
# define Q_COMPILER_CONSTEXPR # define Q_COMPILER_CONSTEXPR
# endif # endif
# if __has_feature(cxx_decltype) /* && __has_feature(cxx_decltype_incomplete_return_types) */ # if __has_feature(cxx_decltype) /* && __has_feature(cxx_decltype_incomplete_return_types) */

View File

@ -1128,6 +1128,7 @@ bool qSharedBuild() Q_DECL_NOTHROW
\value MV_10_8 OS X 10.8 \value MV_10_8 OS X 10.8
\value MV_10_9 OS X 10.9 \value MV_10_9 OS X 10.9
\value MV_10_10 OS X 10.10 \value MV_10_10 OS X 10.10
\value MV_10_11 OS X 10.11
\value MV_Unknown An unknown and currently unsupported platform \value MV_Unknown An unknown and currently unsupported platform
\value MV_CHEETAH Apple codename for MV_10_0 \value MV_CHEETAH Apple codename for MV_10_0
@ -1141,6 +1142,7 @@ bool qSharedBuild() Q_DECL_NOTHROW
\value MV_MOUNTAINLION Apple codename for MV_10_8 \value MV_MOUNTAINLION Apple codename for MV_10_8
\value MV_MAVERICKS Apple codename for MV_10_9 \value MV_MAVERICKS Apple codename for MV_10_9
\value MV_YOSEMITE Apple codename for MV_10_10 \value MV_YOSEMITE Apple codename for MV_10_10
\value MV_ELCAPITAN Apple codename for MV_10_11
\value MV_IOS iOS (any) \value MV_IOS iOS (any)
\value MV_IOS_4_3 iOS 4.3 \value MV_IOS_4_3 iOS 4.3
@ -1151,6 +1153,11 @@ bool qSharedBuild() Q_DECL_NOTHROW
\value MV_IOS_7_0 iOS 7.0 \value MV_IOS_7_0 iOS 7.0
\value MV_IOS_7_1 iOS 7.1 \value MV_IOS_7_1 iOS 7.1
\value MV_IOS_8_0 iOS 8.0 \value MV_IOS_8_0 iOS 8.0
\value MV_IOS_8_1 iOS 8.1
\value MV_IOS_8_2 iOS 8.2
\value MV_IOS_8_3 iOS 8.3
\value MV_IOS_8_4 iOS 8.4
\value MV_IOS_9_0 iOS 9.0
\value MV_None Not a Darwin operating system \value MV_None Not a Darwin operating system
@ -2735,6 +2742,9 @@ QString QSysInfo::prettyProductName()
case MV_YOSEMITE: case MV_YOSEMITE:
basename = "OS X Yosemite ("; basename = "OS X Yosemite (";
break; break;
case MV_ELCAPITAN:
basename = "OS X El Capitan (";
break;
} }
if (basename) if (basename)
return QLatin1String(basename) + productVersion() + QLatin1Char(')'); return QLatin1String(basename) + productVersion() + QLatin1Char(')');

View File

@ -137,6 +137,7 @@ public:
MV_10_8 = 0x000A, MV_10_8 = 0x000A,
MV_10_9 = 0x000B, MV_10_9 = 0x000B,
MV_10_10 = 0x000C, MV_10_10 = 0x000C,
MV_10_11 = 0x000D,
/* codenames */ /* codenames */
MV_CHEETAH = MV_10_0, MV_CHEETAH = MV_10_0,
@ -150,6 +151,7 @@ public:
MV_MOUNTAINLION = MV_10_8, MV_MOUNTAINLION = MV_10_8,
MV_MAVERICKS = MV_10_9, MV_MAVERICKS = MV_10_9,
MV_YOSEMITE = MV_10_10, MV_YOSEMITE = MV_10_10,
MV_ELCAPITAN = MV_10_11,
/* iOS */ /* iOS */
MV_IOS = 1 << 8, MV_IOS = 1 << 8,
@ -160,7 +162,12 @@ public:
MV_IOS_6_1 = Q_MV_IOS(6, 1), MV_IOS_6_1 = Q_MV_IOS(6, 1),
MV_IOS_7_0 = Q_MV_IOS(7, 0), MV_IOS_7_0 = Q_MV_IOS(7, 0),
MV_IOS_7_1 = Q_MV_IOS(7, 1), MV_IOS_7_1 = Q_MV_IOS(7, 1),
MV_IOS_8_0 = Q_MV_IOS(8, 0) MV_IOS_8_0 = Q_MV_IOS(8, 0),
MV_IOS_8_1 = Q_MV_IOS(8, 1),
MV_IOS_8_2 = Q_MV_IOS(8, 2),
MV_IOS_8_3 = Q_MV_IOS(8, 3),
MV_IOS_8_4 = Q_MV_IOS(8, 4),
MV_IOS_9_0 = Q_MV_IOS(9, 0)
}; };
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)
static const MacVersion MacintoshVersion; static const MacVersion MacintoshVersion;

View File

@ -233,6 +233,9 @@
# if !defined(__MAC_10_10) # if !defined(__MAC_10_10)
# define __MAC_10_10 101000 # define __MAC_10_10 101000
# endif # endif
# if !defined(__MAC_10_11)
# define __MAC_10_11 101100
# endif
# if !defined(MAC_OS_X_VERSION_10_7) # if !defined(MAC_OS_X_VERSION_10_7)
# define MAC_OS_X_VERSION_10_7 1070 # define MAC_OS_X_VERSION_10_7 1070
# endif # endif
@ -245,6 +248,9 @@
# if !defined(MAC_OS_X_VERSION_10_10) # if !defined(MAC_OS_X_VERSION_10_10)
# define MAC_OS_X_VERSION_10_10 101000 # define MAC_OS_X_VERSION_10_10 101000
# endif # endif
# if !defined(MAC_OS_X_VERSION_10_11)
# define MAC_OS_X_VERSION_10_11 101100
# endif
# #
# if !defined(__IPHONE_4_3) # if !defined(__IPHONE_4_3)
# define __IPHONE_4_3 40300 # define __IPHONE_4_3 40300
@ -270,6 +276,21 @@
# if !defined(__IPHONE_8_0) # if !defined(__IPHONE_8_0)
# define __IPHONE_8_0 80000 # define __IPHONE_8_0 80000
# endif # endif
# if !defined(__IPHONE_8_1)
# define __IPHONE_8_1 80100
# endif
# if !defined(__IPHONE_8_2)
# define __IPHONE_8_2 80200
# endif
# if !defined(__IPHONE_8_3)
# define __IPHONE_8_3 80300
# endif
# if !defined(__IPHONE_8_4)
# define __IPHONE_8_4 80400
# endif
# if !defined(__IPHONE_9_0)
# define __IPHONE_9_0 90000
# endif
#endif #endif
#ifdef __LSB_VERSION__ #ifdef __LSB_VERSION__

View File

@ -2053,7 +2053,7 @@ QByteArray QProcess::readAllStandardError()
printed at the console, and the existing process will continue running printed at the console, and the existing process will continue running
unaffected. unaffected.
\sa pid(), started(), waitForStarted(), setNativeArguments() \sa processId(), started(), waitForStarted(), setNativeArguments()
*/ */
void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode) void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode)
{ {

View File

@ -186,6 +186,8 @@ QString QStorageInfo::rootPath() const
This size can be less than or equal to the free size returned by This size can be less than or equal to the free size returned by
bytesFree() function. bytesFree() function.
Returns -1 if QStorageInfo object is not valid.
\sa bytesTotal(), bytesFree() \sa bytesTotal(), bytesFree()
*/ */
qint64 QStorageInfo::bytesAvailable() const qint64 QStorageInfo::bytesAvailable() const
@ -198,6 +200,8 @@ qint64 QStorageInfo::bytesAvailable() const
quotas on the filesystem, this value can be larger than the value quotas on the filesystem, this value can be larger than the value
returned by bytesAvailable(). returned by bytesAvailable().
Returns -1 if QStorageInfo object is not valid.
\sa bytesTotal(), bytesAvailable() \sa bytesTotal(), bytesAvailable()
*/ */
qint64 QStorageInfo::bytesFree() const qint64 QStorageInfo::bytesFree() const
@ -208,6 +212,8 @@ qint64 QStorageInfo::bytesFree() const
/*! /*!
Returns the total volume size in bytes. Returns the total volume size in bytes.
Returns -1 if QStorageInfo object is not valid.
\sa bytesFree(), bytesAvailable() \sa bytesFree(), bytesAvailable()
*/ */
qint64 QStorageInfo::bytesTotal() const qint64 QStorageInfo::bytesTotal() const

View File

@ -53,7 +53,7 @@ class QStorageInfoPrivate : public QSharedData
{ {
public: public:
inline QStorageInfoPrivate() : QSharedData(), inline QStorageInfoPrivate() : QSharedData(),
bytesTotal(0), bytesFree(0), bytesAvailable(0), bytesTotal(-1), bytesFree(-1), bytesAvailable(-1),
readOnly(false), ready(false), valid(false) readOnly(false), ready(false), valid(false)
{} {}

View File

@ -1591,7 +1591,7 @@ QString QTextStream::readLine(qint64 maxlen)
{ {
QString line; QString line;
readLine(&line, maxlen); readLineInto(&line, maxlen);
return line; return line;
} }
@ -1612,7 +1612,7 @@ QString QTextStream::readLine(qint64 maxlen)
If \a line has sufficient capacity for the data that is about to be If \a line has sufficient capacity for the data that is about to be
read, this function may not need to allocate new memory. Because of read, this function may not need to allocate new memory. Because of
this, it can be faster than the other readLine() overload. this, it can be faster than readLine().
Returns \c false if the stream has read to the end of the file or Returns \c false if the stream has read to the end of the file or
an error has occurred; otherwise returns \c true. The contents in an error has occurred; otherwise returns \c true. The contents in
@ -1620,7 +1620,7 @@ QString QTextStream::readLine(qint64 maxlen)
\sa readAll(), QIODevice::readLine() \sa readAll(), QIODevice::readLine()
*/ */
bool QTextStream::readLine(QString *line, qint64 maxlen) bool QTextStream::readLineInto(QString *line, qint64 maxlen)
{ {
Q_D(QTextStream); Q_D(QTextStream);
// keep in sync with CHECK_VALID_STREAM // keep in sync with CHECK_VALID_STREAM

View File

@ -124,7 +124,7 @@ public:
void skipWhiteSpace(); void skipWhiteSpace();
QString readLine(qint64 maxlen = 0); QString readLine(qint64 maxlen = 0);
bool readLine(QString *line, qint64 maxlen = 0); bool readLineInto(QString *line, qint64 maxlen = 0);
QString readAll(); QString readAll();
QString read(qint64 maxlen); QString read(qint64 maxlen);

View File

@ -1005,6 +1005,17 @@ bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
do not change the focus widget. do not change the focus widget.
\endlist \endlist
\b{Future direction:} This function will not be called for objects that live
outside the main thread in Qt 6. Applications that need that functionality
should find other solutions for their event inspection needs in the meantime.
The change may be extended to the main thread, causing this function to be
deprecated.
\warning If you override this function, you must ensure all threads that
process events stop doing so before your application object begins
destruction. This includes threads started by other libraries that you may be
using, but does not apply to Qt's own threads.
\sa QObject::event(), installNativeEventFilter() \sa QObject::event(), installNativeEventFilter()
*/ */

View File

@ -303,7 +303,7 @@ struct DefinedTypesFilter {
\omitvalue WeakPointerToQObject \omitvalue WeakPointerToQObject
\omitvalue TrackingPointerToQObject \omitvalue TrackingPointerToQObject
\omitvalue WasDeclaredAsMetaType \omitvalue WasDeclaredAsMetaType
\value IsGadget This type is a Q_GADGET and it's corresponding QMetaObject can be accessed with QMetaType::metaObject Since 5.5. \omitvalue IsGadget This type is a Q_GADGET and it's corresponding QMetaObject can be accessed with QMetaType::metaObject Since 5.5.
*/ */
/*! /*!
@ -1046,6 +1046,16 @@ int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
if (idx >= User) { if (idx >= User) {
previousSize = ct->at(idx - User).size; previousSize = ct->at(idx - User).size;
previousFlags = ct->at(idx - User).flags; previousFlags = ct->at(idx - User).flags;
// Set new/additional flags in case of old library/app.
// Ensures that older code works in conjunction with new Qt releases
// requiring the new flags.
if (flags != previousFlags) {
QCustomTypeInfo &inf = ct->data()[idx - User];
inf.flags |= flags;
if (metaObject)
inf.metaObject = metaObject;
}
} }
} }
@ -1061,11 +1071,11 @@ int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
normalizedTypeName.constData(), idx, previousSize, size); normalizedTypeName.constData(), idx, previousSize, size);
} }
// Do not compare types higher than 0x100:
// Ignore WasDeclaredAsMetaType inconsitency, to many users were hitting the problem // Ignore WasDeclaredAsMetaType inconsitency, to many users were hitting the problem
previousFlags |= WasDeclaredAsMetaType; // Ignore IsGadget as it was added in Qt 5.5
flags |= WasDeclaredAsMetaType; // Ignore all the future flags as well
if ((previousFlags ^ flags) & 0xff) {
if (previousFlags != flags) {
const int maskForTypeInfo = NeedsConstruction | NeedsDestruction | MovableType; const int maskForTypeInfo = NeedsConstruction | NeedsDestruction | MovableType;
const char *msg = "QMetaType::registerType: Binary compatibility break. " const char *msg = "QMetaType::registerType: Binary compatibility break. "
"\nType flags for type '%s' [%i] don't match. Previously " "\nType flags for type '%s' [%i] don't match. Previously "

View File

@ -59,7 +59,7 @@ class Q_CORE_EXPORT QAbstractTransition : public QObject
Q_PROPERTY(QState* sourceState READ sourceState) Q_PROPERTY(QState* sourceState READ sourceState)
Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState NOTIFY targetStateChanged) Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState NOTIFY targetStateChanged)
Q_PROPERTY(QList<QAbstractState*> targetStates READ targetStates WRITE setTargetStates NOTIFY targetStatesChanged) Q_PROPERTY(QList<QAbstractState*> targetStates READ targetStates WRITE setTargetStates NOTIFY targetStatesChanged)
Q_PROPERTY(TransitionType transitionType READ transitionType WRITE setTransitionType) Q_PROPERTY(TransitionType transitionType READ transitionType WRITE setTransitionType REVISION 1)
public: public:
enum TransitionType { enum TransitionType {
ExternalTransition, ExternalTransition,

View File

@ -2743,7 +2743,7 @@ const QString &QAccessibleActionInterface::toggleAction()
Returns the name of the scroll left default action. Returns the name of the scroll left default action.
\sa actionNames(), localizedActionName() \sa actionNames(), localizedActionName()
*/ */
const QString &QAccessibleActionInterface::scrollLeftAction() QString QAccessibleActionInterface::scrollLeftAction()
{ {
return accessibleActionStrings()->scrollLeftAction; return accessibleActionStrings()->scrollLeftAction;
} }
@ -2752,7 +2752,7 @@ const QString &QAccessibleActionInterface::scrollLeftAction()
Returns the name of the scroll right default action. Returns the name of the scroll right default action.
\sa actionNames(), localizedActionName() \sa actionNames(), localizedActionName()
*/ */
const QString &QAccessibleActionInterface::scrollRightAction() QString QAccessibleActionInterface::scrollRightAction()
{ {
return accessibleActionStrings()->scrollRightAction; return accessibleActionStrings()->scrollRightAction;
} }
@ -2761,7 +2761,7 @@ const QString &QAccessibleActionInterface::scrollRightAction()
Returns the name of the scroll up default action. Returns the name of the scroll up default action.
\sa actionNames(), localizedActionName() \sa actionNames(), localizedActionName()
*/ */
const QString &QAccessibleActionInterface::scrollUpAction() QString QAccessibleActionInterface::scrollUpAction()
{ {
return accessibleActionStrings()->scrollUpAction; return accessibleActionStrings()->scrollUpAction;
} }
@ -2770,7 +2770,7 @@ const QString &QAccessibleActionInterface::scrollUpAction()
Returns the name of the scroll down default action. Returns the name of the scroll down default action.
\sa actionNames(), localizedActionName() \sa actionNames(), localizedActionName()
*/ */
const QString &QAccessibleActionInterface::scrollDownAction() QString QAccessibleActionInterface::scrollDownAction()
{ {
return accessibleActionStrings()->scrollDownAction; return accessibleActionStrings()->scrollDownAction;
} }
@ -2779,7 +2779,7 @@ const QString &QAccessibleActionInterface::scrollDownAction()
Returns the name of the previous page default action. Returns the name of the previous page default action.
\sa actionNames(), localizedActionName() \sa actionNames(), localizedActionName()
*/ */
const QString &QAccessibleActionInterface::previousPageAction() QString QAccessibleActionInterface::previousPageAction()
{ {
return accessibleActionStrings()->previousPageAction; return accessibleActionStrings()->previousPageAction;
} }
@ -2788,7 +2788,7 @@ const QString &QAccessibleActionInterface::previousPageAction()
Returns the name of the next page default action. Returns the name of the next page default action.
\sa actionNames(), localizedActionName() \sa actionNames(), localizedActionName()
*/ */
const QString &QAccessibleActionInterface::nextPageAction() QString QAccessibleActionInterface::nextPageAction()
{ {
return accessibleActionStrings()->nextPageAction; return accessibleActionStrings()->nextPageAction;
} }

View File

@ -636,12 +636,12 @@ public:
static const QString &showMenuAction(); static const QString &showMenuAction();
static const QString &setFocusAction(); static const QString &setFocusAction();
static const QString &toggleAction(); static const QString &toggleAction();
static const QString &scrollLeftAction(); static QString scrollLeftAction();
static const QString &scrollRightAction(); static QString scrollRightAction();
static const QString &scrollUpAction(); static QString scrollUpAction();
static const QString &scrollDownAction(); static QString scrollDownAction();
static const QString &nextPageAction(); static QString nextPageAction();
static const QString &previousPageAction(); static QString previousPageAction();
}; };
class Q_GUI_EXPORT QAccessibleImageInterface class Q_GUI_EXPORT QAccessibleImageInterface

View File

@ -137,12 +137,6 @@ QVariant QPlatformDialogHelper::defaultStyleHint(QPlatformDialogHelper::StyleHi
return QVariant(); return QVariant();
} }
void QPlatformDialogHelper::execModalForWindow(QWindow *parent)
{
Q_UNUSED(parent);
exec();
}
// Font dialog // Font dialog
class QFontDialogOptionsPrivate : public QSharedData class QFontDialogOptionsPrivate : public QSharedData

View File

@ -145,7 +145,6 @@ public:
virtual QVariant styleHint(StyleHint hint) const; virtual QVariant styleHint(StyleHint hint) const;
virtual void exec() = 0; virtual void exec() = 0;
virtual void execModalForWindow(QWindow *parent);
virtual bool show(Qt::WindowFlags windowFlags, virtual bool show(Qt::WindowFlags windowFlags,
Qt::WindowModality windowModality, Qt::WindowModality windowModality,
QWindow *parent) = 0; QWindow *parent) = 0;

View File

@ -285,11 +285,23 @@ bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port)
return false; return false;
} }
d->socketState = QAbstractSocket::ConnectingState; d->socketState = QAbstractSocket::ConnectingState;
hr = d->connectOp->put_Completed(Callback<IAsyncActionCompletedHandler>( hr = QWinRTFunctions::await(d->connectOp);
d, &QNativeSocketEnginePrivate::handleConnectToHost).Get()); RETURN_FALSE_IF_FAILED("Connection could not be established");
Q_ASSERT_SUCCEEDED(hr); bool connectionErrors = false;
d->handleConnectionErrors(d->connectOp.Get(), &connectionErrors);
if (connectionErrors)
return false;
d->connectOp.Reset();
return d->socketState == QAbstractSocket::ConnectedState; d->socketState = QAbstractSocket::ConnectedState;
emit connectionReady();
// Delay the reader so that the SSL socket can upgrade
if (d->sslSocket)
connect(d->sslSocket, SIGNAL(encrypted()), SLOT(establishRead()));
else
establishRead();
return true;
} }
bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port) bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port)
@ -1104,47 +1116,34 @@ HRESULT QNativeSocketEnginePrivate::handleClientConnection(IStreamSocketListener
return S_OK; return S_OK;
} }
HRESULT QNativeSocketEnginePrivate::handleConnectToHost(IAsyncAction *action, AsyncStatus) void QNativeSocketEnginePrivate::handleConnectionErrors(IAsyncAction *connectAction, bool *errorsOccured)
{ {
Q_Q(QNativeSocketEngine); bool error = true;
HRESULT hr = connectAction->GetResults();
HRESULT hr = action->GetResults();
if (wasDeleted || !connectOp) // Protect against a late callback
return S_OK;
connectOp.Reset();
switch (hr) { switch (hr) {
case 0x8007274c: // A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. case 0x8007274c: // A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString); setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
socketState = QAbstractSocket::UnconnectedState; socketState = QAbstractSocket::UnconnectedState;
return S_OK; break;
case 0x80072751: // A socket operation was attempted to an unreachable host. case 0x80072751: // A socket operation was attempted to an unreachable host.
setError(QAbstractSocket::HostNotFoundError, HostUnreachableErrorString); setError(QAbstractSocket::HostNotFoundError, HostUnreachableErrorString);
socketState = QAbstractSocket::UnconnectedState; socketState = QAbstractSocket::UnconnectedState;
return S_OK; break;
case 0x8007274d: // No connection could be made because the target machine actively refused it. case 0x8007274d: // No connection could be made because the target machine actively refused it.
setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString); setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
socketState = QAbstractSocket::UnconnectedState; socketState = QAbstractSocket::UnconnectedState;
return S_OK; break;
default: default:
if (FAILED(hr)) { if (FAILED(hr)) {
setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString); setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString);
socketState = QAbstractSocket::UnconnectedState; socketState = QAbstractSocket::UnconnectedState;
return S_OK; } else {
error = false;
} }
break; break;
} }
if (errorsOccured)
socketState = QAbstractSocket::ConnectedState; *errorsOccured = error;
emit q->connectionReady();
// Delay the reader so that the SSL socket can upgrade
if (sslSocket)
q->connect(sslSocket, SIGNAL(encrypted()), SLOT(establishRead()));
else
q->establishRead();
return S_OK;
} }
HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *asyncInfo, AsyncStatus status) HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *asyncInfo, AsyncStatus status)

View File

@ -216,7 +216,7 @@ private:
ABI::Windows::Networking::Sockets::IDatagramSocketMessageReceivedEventArgs *args); ABI::Windows::Networking::Sockets::IDatagramSocketMessageReceivedEventArgs *args);
HRESULT handleClientConnection(ABI::Windows::Networking::Sockets::IStreamSocketListener *tcpListener, HRESULT handleClientConnection(ABI::Windows::Networking::Sockets::IStreamSocketListener *tcpListener,
ABI::Windows::Networking::Sockets::IStreamSocketListenerConnectionReceivedEventArgs *args); ABI::Windows::Networking::Sockets::IStreamSocketListenerConnectionReceivedEventArgs *args);
HRESULT handleConnectToHost(ABI::Windows::Foundation::IAsyncAction *, ABI::Windows::Foundation::AsyncStatus); void handleConnectionErrors(ABI::Windows::Foundation::IAsyncAction *connectAction, bool *errorsOccured);
HRESULT handleReadyRead(ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Storage::Streams::IBuffer *, UINT32> *asyncInfo, ABI::Windows::Foundation::AsyncStatus); HRESULT handleReadyRead(ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Storage::Streams::IBuffer *, UINT32> *asyncInfo, ABI::Windows::Foundation::AsyncStatus);
}; };

View File

@ -54,6 +54,7 @@
#include "qsslcipher.h" #include "qsslcipher.h"
#include "qsslcipher_p.h" #include "qsslcipher_p.h"
#include "qsslsocket.h" #include "qsslsocket.h"
#include "qsslconfiguration.h"
#ifndef QT_NO_DEBUG_STREAM #ifndef QT_NO_DEBUG_STREAM
#include <QtCore/qdebug.h> #include <QtCore/qdebug.h>
@ -81,7 +82,7 @@ QSslCipher::QSslCipher()
QSslCipher::QSslCipher(const QString &name) QSslCipher::QSslCipher(const QString &name)
: d(new QSslCipherPrivate) : d(new QSslCipherPrivate)
{ {
foreach (const QSslCipher &cipher, QSslSocket::supportedCiphers()) { foreach (const QSslCipher &cipher, QSslConfiguration::supportedCiphers()) {
if (cipher.name() == name) { if (cipher.name() == name) {
*this = cipher; *this = cipher;
return; return;
@ -102,7 +103,7 @@ QSslCipher::QSslCipher(const QString &name)
QSslCipher::QSslCipher(const QString &name, QSsl::SslProtocol protocol) QSslCipher::QSslCipher(const QString &name, QSsl::SslProtocol protocol)
: d(new QSslCipherPrivate) : d(new QSslCipherPrivate)
{ {
foreach (const QSslCipher &cipher, QSslSocket::supportedCiphers()) { foreach (const QSslCipher &cipher, QSslConfiguration::supportedCiphers()) {
if (cipher.name() == name && cipher.protocol() == protocol) { if (cipher.name() == name && cipher.protocol() == protocol) {
*this = cipher; *this = cipher;
return; return;

View File

@ -36,6 +36,7 @@
#include "qsslconfiguration.h" #include "qsslconfiguration.h"
#include "qsslconfiguration_p.h" #include "qsslconfiguration_p.h"
#include "qsslsocket.h" #include "qsslsocket.h"
#include "qsslsocket_p.h"
#include "qmutex.h" #include "qmutex.h"
#include "qdebug.h" #include "qdebug.h"
@ -589,6 +590,20 @@ void QSslConfiguration::setCiphers(const QList<QSslCipher> &ciphers)
d->ciphers = ciphers; d->ciphers = ciphers;
} }
/*!
\since 5.5
Returns the list of cryptographic ciphers supported by this
system. This list is set by the system's SSL libraries and may
vary from system to system.
\sa ciphers(), setCiphers()
*/
QList<QSslCipher> QSslConfiguration::supportedCiphers()
{
return QSslSocketPrivate::supportedCiphers();
}
/*! /*!
Returns this connection's CA certificate database. The CA certificate Returns this connection's CA certificate database. The CA certificate
database is used by the socket during the handshake phase to database is used by the socket during the handshake phase to
@ -618,6 +633,22 @@ void QSslConfiguration::setCaCertificates(const QList<QSslCertificate> &certific
d->allowRootCertOnDemandLoading = false; d->allowRootCertOnDemandLoading = false;
} }
/*!
\since 5.5
This function provides the CA certificate database
provided by the operating system. The CA certificate database
returned by this function is used to initialize the database
returned by caCertificates() on the default QSslConfiguration.
\sa caCertificates(), setCaCertificates(), defaultConfiguration()
*/
QList<QSslCertificate> QSslConfiguration::systemCaCertificates()
{
// we are calling ensureInitialized() in the method below
return QSslSocketPrivate::systemCaCertificates();
}
/*! /*!
Enables or disables an SSL compatibility \a option. If \a on Enables or disables an SSL compatibility \a option. If \a on
is true, the \a option is enabled. If \a on is false, the is true, the \a option is enabled. If \a on is false, the
@ -743,6 +774,20 @@ void QSslConfiguration::setEllipticCurves(const QVector<QSslEllipticCurve> &curv
d->ellipticCurves = curves; d->ellipticCurves = curves;
} }
/*!
\since 5.5
Returns the list of elliptic curves supported by this
system. This list is set by the system's SSL libraries and may
vary from system to system.
\sa ellipticCurves(), setEllipticCurves()
*/
QVector<QSslEllipticCurve> QSslConfiguration::supportedEllipticCurves()
{
return QSslSocketPrivate::supportedEllipticCurves();
}
/*! /*!
\since 5.3 \since 5.3

View File

@ -111,10 +111,12 @@ public:
// Cipher settings // Cipher settings
QList<QSslCipher> ciphers() const; QList<QSslCipher> ciphers() const;
void setCiphers(const QList<QSslCipher> &ciphers); void setCiphers(const QList<QSslCipher> &ciphers);
static QList<QSslCipher> supportedCiphers();
// Certificate Authority (CA) settings // Certificate Authority (CA) settings
QList<QSslCertificate> caCertificates() const; QList<QSslCertificate> caCertificates() const;
void setCaCertificates(const QList<QSslCertificate> &certificates); void setCaCertificates(const QList<QSslCertificate> &certificates);
static QList<QSslCertificate> systemCaCertificates();
void setSslOption(QSsl::SslOption option, bool on); void setSslOption(QSsl::SslOption option, bool on);
bool testSslOption(QSsl::SslOption option) const; bool testSslOption(QSsl::SslOption option) const;
@ -126,6 +128,7 @@ public:
// EC settings // EC settings
QVector<QSslEllipticCurve> ellipticCurves() const; QVector<QSslEllipticCurve> ellipticCurves() const;
void setEllipticCurves(const QVector<QSslEllipticCurve> &curves); void setEllipticCurves(const QVector<QSslEllipticCurve> &curves);
static QVector<QSslEllipticCurve> supportedEllipticCurves();
static QSslConfiguration defaultConfiguration(); static QSslConfiguration defaultConfiguration();
static void setDefaultConfiguration(const QSslConfiguration &configuration); static void setDefaultConfiguration(const QSslConfiguration &configuration);

View File

@ -43,13 +43,13 @@ QT_BEGIN_NAMESPACE
class QSslPreSharedKeyAuthenticatorPrivate; class QSslPreSharedKeyAuthenticatorPrivate;
class Q_NETWORK_EXPORT QSslPreSharedKeyAuthenticator class QSslPreSharedKeyAuthenticator
{ {
public: public:
QSslPreSharedKeyAuthenticator(); Q_NETWORK_EXPORT QSslPreSharedKeyAuthenticator();
~QSslPreSharedKeyAuthenticator(); Q_NETWORK_EXPORT ~QSslPreSharedKeyAuthenticator();
QSslPreSharedKeyAuthenticator(const QSslPreSharedKeyAuthenticator &authenticator); Q_NETWORK_EXPORT QSslPreSharedKeyAuthenticator(const QSslPreSharedKeyAuthenticator &authenticator);
QSslPreSharedKeyAuthenticator &operator=(const QSslPreSharedKeyAuthenticator &authenticator); Q_NETWORK_EXPORT QSslPreSharedKeyAuthenticator &operator=(const QSslPreSharedKeyAuthenticator &authenticator);
#ifdef Q_COMPILER_RVALUE_REFS #ifdef Q_COMPILER_RVALUE_REFS
inline QSslPreSharedKeyAuthenticator &operator=(QSslPreSharedKeyAuthenticator &&authenticator) inline QSslPreSharedKeyAuthenticator &operator=(QSslPreSharedKeyAuthenticator &&authenticator)
@ -61,15 +61,15 @@ public:
d.swap(authenticator.d); d.swap(authenticator.d);
} }
QByteArray identityHint() const; Q_NETWORK_EXPORT QByteArray identityHint() const;
void setIdentity(const QByteArray &identity); Q_NETWORK_EXPORT void setIdentity(const QByteArray &identity);
QByteArray identity() const; Q_NETWORK_EXPORT QByteArray identity() const;
int maximumIdentityLength() const; Q_NETWORK_EXPORT int maximumIdentityLength() const;
void setPreSharedKey(const QByteArray &preSharedKey); Q_NETWORK_EXPORT void setPreSharedKey(const QByteArray &preSharedKey);
QByteArray preSharedKey() const; Q_NETWORK_EXPORT QByteArray preSharedKey() const;
int maximumPreSharedKeyLength() const; Q_NETWORK_EXPORT int maximumPreSharedKeyLength() const;
private: private:
friend Q_NETWORK_EXPORT bool operator==(const QSslPreSharedKeyAuthenticator &lhs, const QSslPreSharedKeyAuthenticator &rhs); friend Q_NETWORK_EXPORT bool operator==(const QSslPreSharedKeyAuthenticator &lhs, const QSslPreSharedKeyAuthenticator &rhs);

View File

@ -1166,6 +1166,10 @@ QSslKey QSslSocket::privateKey() const
} }
/*! /*!
\deprecated
Use QSslConfiguration::ciphers() instead.
Returns this socket's current cryptographic cipher suite. This Returns this socket's current cryptographic cipher suite. This
list is used during the socket's handshake phase for choosing a list is used during the socket's handshake phase for choosing a
session cipher. The returned list of ciphers is ordered by session cipher. The returned list of ciphers is ordered by
@ -1197,6 +1201,10 @@ QList<QSslCipher> QSslSocket::ciphers() const
} }
/*! /*!
\deprecated
USe QSslConfiguration::setCiphers() instead.
Sets the cryptographic cipher suite for this socket to \a ciphers, Sets the cryptographic cipher suite for this socket to \a ciphers,
which must contain a subset of the ciphers in the list returned by which must contain a subset of the ciphers in the list returned by
supportedCiphers(). supportedCiphers().
@ -1213,6 +1221,10 @@ void QSslSocket::setCiphers(const QList<QSslCipher> &ciphers)
} }
/*! /*!
\deprecated
Use QSslConfiguration::setCiphers() instead.
Sets the cryptographic cipher suite for this socket to \a ciphers, which Sets the cryptographic cipher suite for this socket to \a ciphers, which
is a colon-separated list of cipher suite names. The ciphers are listed in is a colon-separated list of cipher suite names. The ciphers are listed in
order of preference, starting with the most preferred cipher. For example: order of preference, starting with the most preferred cipher. For example:
@ -1238,6 +1250,10 @@ void QSslSocket::setCiphers(const QString &ciphers)
} }
/*! /*!
\deprecated
Use QSslConfiguration::setCiphers() on the default QSslConfiguration instead.
Sets the default cryptographic cipher suite for all sockets in Sets the default cryptographic cipher suite for all sockets in
this application to \a ciphers, which must contain a subset of the this application to \a ciphers, which must contain a subset of the
ciphers in the list returned by supportedCiphers(). ciphers in the list returned by supportedCiphers().
@ -1254,6 +1270,10 @@ void QSslSocket::setDefaultCiphers(const QList<QSslCipher> &ciphers)
} }
/*! /*!
\deprecated
Use QSslConfiguration::ciphers() on the default QSslConfiguration instead.
Returns the default cryptographic cipher suite for all sockets in Returns the default cryptographic cipher suite for all sockets in
this application. This list is used during the socket's handshake this application. This list is used during the socket's handshake
phase when negotiating with the peer to choose a session cipher. phase when negotiating with the peer to choose a session cipher.
@ -1273,6 +1293,10 @@ QList<QSslCipher> QSslSocket::defaultCiphers()
} }
/*! /*!
\deprecated
Use QSslConfiguration::supportedCiphers() instead.
Returns the list of cryptographic ciphers supported by this Returns the list of cryptographic ciphers supported by this
system. This list is set by the system's SSL libraries and may system. This list is set by the system's SSL libraries and may
vary from system to system. vary from system to system.
@ -1284,120 +1308,6 @@ QList<QSslCipher> QSslSocket::supportedCiphers()
return QSslSocketPrivate::supportedCiphers(); return QSslSocketPrivate::supportedCiphers();
} }
/*!
\since 5.5
Returns this socket's current list of elliptic curves. This
list is used during the socket's handshake phase for choosing an
elliptic curve (when using an elliptic curve cipher).
The returned list of curves is ordered by descending preference
(i.e., the first curve in the list is the most preferred one).
By default, this list is empty. An empty default list means that the
handshake phase can choose any of the curves supported by this system's SSL
libraries (which may vary from system to system). The list of curves
supported by this system's SSL libraries is returned by
supportedEllipticCurves().
You can restrict the list of curves used for choosing the session cipher
for this socket by calling setEllipticCurves() with a subset of the
supported ciphers. You can revert to using the entire set by calling
setEllipticCurves() with the list returned by supportedEllipticCurves().
\sa setEllipticCurves(), defaultEllipticCurves(), setDefaultEllipticCurves(), supportedEllipticCurves()
*/
QVector<QSslEllipticCurve> QSslSocket::ellipticCurves() const
{
Q_D(const QSslSocket);
return d->configuration.ellipticCurves;
}
/*!
\since 5.5
Sets the list of elliptic curves to be used by this socket to \a curves,
which must contain a subset of the curves in the list returned by
supportedEllipticCurves().
Restricting the elliptic curves must be done before the handshake
phase, where the session cipher is chosen.
If an empty list is set, then the handshake phase can choose any of the
curves supported by this system's SSL libraries (which may vary from system
to system). The list of curves supported by this system's SSL libraries is
returned by supportedEllipticCurves().
Use setCipher() in order to disable the usage of elliptic curve ciphers.
\sa ellipticCurves(), setDefaultEllipticCurves(), supportedEllipticCurves()
*/
void QSslSocket::setEllipticCurves(const QVector<QSslEllipticCurve> &curves)
{
Q_D(QSslSocket);
d->configuration.ellipticCurves = curves;
}
/*!
\since 5.5
Sets the list of elliptic curves to be used by all sockets in this
application to \a curves, which must contain a subset of the curves in the
list returned by supportedEllipticCurves().
Restricting the default elliptic curves only affects SSL sockets
that perform their handshake phase after the default list has been changed.
If an empty list is set, then the handshake phase can choose any of the
curves supported by this system's SSL libraries (which may vary from system
to system). The list of curves supported by this system's SSL libraries is
returned by supportedEllipticCurves().
Use setDefaultCiphers() in order to disable the usage of elliptic curve ciphers.
\sa setEllipticCurves(), defaultEllipticCurves(), supportedEllipticCurves()
*/
void QSslSocket::setDefaultEllipticCurves(const QVector<QSslEllipticCurve> &curves)
{
QSslSocketPrivate::setDefaultEllipticCurves(curves);
}
/*!
\since 5.5
Returns the default elliptic curves list for all sockets in
this application. This list is used during the socket's handshake
phase when negotiating with the peer to choose a session cipher.
The list is ordered by preference (i.e., the first curve in the
list is the most preferred one).
By default, this list is empty. An empty default list means that the
handshake phase can choose any of the curves supported by this system's SSL
libraries (which may vary from system to system). The list of curves
supported by this system's SSL libraries is returned by
supportedEllipticCurves().
\sa setDefaultEllipticCurves(), supportedEllipticCurves()
*/
QVector<QSslEllipticCurve> QSslSocket::defaultEllipticCurves()
{
return QSslSocketPrivate::defaultEllipticCurves();
}
/*!
\since 5.5
Returns the list of elliptic curves supported by this
system. This list is set by the system's SSL libraries and may
vary from system to system.
\sa ellipticCurves(), setEllipticCurves(), defaultEllipticCurves()
*/
QVector<QSslEllipticCurve> QSslSocket::supportedEllipticCurves()
{
return QSslSocketPrivate::supportedEllipticCurves();
}
/*! /*!
Searches all files in the \a path for certificates encoded in the Searches all files in the \a path for certificates encoded in the
specified \a format and adds them to this socket's CA certificate specified \a format and adds them to this socket's CA certificate
@ -1456,6 +1366,10 @@ void QSslSocket::addCaCertificates(const QList<QSslCertificate> &certificates)
} }
/*! /*!
\deprecated
Use QSslConfiguration::setCaCertificates() instead.
Sets this socket's CA certificate database to be \a certificates. Sets this socket's CA certificate database to be \a certificates.
The certificate database must be set prior to the SSL handshake. The certificate database must be set prior to the SSL handshake.
The CA certificate database is used by the socket during the The CA certificate database is used by the socket during the
@ -1475,6 +1389,10 @@ void QSslSocket::setCaCertificates(const QList<QSslCertificate> &certificates)
} }
/*! /*!
\deprecated
Use QSslConfiguration::caCertificates() instead.
Returns this socket's CA certificate database. The CA certificate Returns this socket's CA certificate database. The CA certificate
database is used by the socket during the handshake phase to database is used by the socket during the handshake phase to
validate the peer's certificate. It can be moodified prior to the validate the peer's certificate. It can be moodified prior to the
@ -1535,6 +1453,10 @@ void QSslSocket::addDefaultCaCertificates(const QList<QSslCertificate> &certific
} }
/*! /*!
\deprecated
Use QSslConfiguration::setCaCertificates() on the default QSslConfiguration instead.
Sets the default CA certificate database to \a certificates. The Sets the default CA certificate database to \a certificates. The
default CA certificate database is originally set to your system's default CA certificate database is originally set to your system's
default CA certificate database. You can override the default CA default CA certificate database. You can override the default CA
@ -1552,6 +1474,10 @@ void QSslSocket::setDefaultCaCertificates(const QList<QSslCertificate> &certific
} }
/*! /*!
\deprecated
Use QSslConfiguration::caCertificates() on the default QSslConfiguration instead.
Returns the current default CA certificate database. This database Returns the current default CA certificate database. This database
is originally set to your system's default CA certificate database. is originally set to your system's default CA certificate database.
If no system default database is found, an empty database will be If no system default database is found, an empty database will be
@ -1572,6 +1498,10 @@ QList<QSslCertificate> QSslSocket::defaultCaCertificates()
} }
/*! /*!
\deprecated
Use QSslConfiguration::systemDefaultCaCertificates instead.
This function provides the CA certificate database This function provides the CA certificate database
provided by the operating system. The CA certificate database provided by the operating system. The CA certificate database
returned by this function is used to initialize the database returned by this function is used to initialize the database
@ -2163,16 +2093,6 @@ void QSslSocketPrivate::setDefaultSupportedCiphers(const QList<QSslCipher> &ciph
globalData()->supportedCiphers = ciphers; globalData()->supportedCiphers = ciphers;
} }
/*!
\internal
*/
QVector<QSslEllipticCurve> QSslSocketPrivate::defaultEllipticCurves()
{
QSslSocketPrivate::ensureInitialized();
const QMutexLocker locker(&globalData()->mutex);
return globalData()->config->ellipticCurves;
}
/*! /*!
\internal \internal
*/ */
@ -2183,16 +2103,6 @@ QVector<QSslEllipticCurve> QSslSocketPrivate::supportedEllipticCurves()
return globalData()->supportedEllipticCurves; return globalData()->supportedEllipticCurves;
} }
/*!
\internal
*/
void QSslSocketPrivate::setDefaultEllipticCurves(const QVector<QSslEllipticCurve> &curves)
{
const QMutexLocker locker(&globalData()->mutex);
globalData()->config.detach();
globalData()->config->ellipticCurves = curves;
}
/*! /*!
\internal \internal
*/ */

View File

@ -144,34 +144,33 @@ public:
QSslKey privateKey() const; QSslKey privateKey() const;
// Cipher settings. // Cipher settings.
QList<QSslCipher> ciphers() const; #if QT_DEPRECATED_SINCE(5, 5)
void setCiphers(const QList<QSslCipher> &ciphers); QT_DEPRECATED_X("Use QSslConfiguration::ciphers()") QList<QSslCipher> ciphers() const;
void setCiphers(const QString &ciphers); QT_DEPRECATED_X("Use QSslConfiguration::setCiphers()") void setCiphers(const QList<QSslCipher> &ciphers);
static void setDefaultCiphers(const QList<QSslCipher> &ciphers); QT_DEPRECATED void setCiphers(const QString &ciphers);
static QList<QSslCipher> defaultCiphers(); QT_DEPRECATED static void setDefaultCiphers(const QList<QSslCipher> &ciphers);
static QList<QSslCipher> supportedCiphers(); QT_DEPRECATED static QList<QSslCipher> defaultCiphers();
QT_DEPRECATED_X("Use QSslConfiguration::supportedCiphers()") static QList<QSslCipher> supportedCiphers();
// EC settings. #endif // QT_DEPRECATED_SINCE(5, 5)
QVector<QSslEllipticCurve> ellipticCurves() const;
void setEllipticCurves(const QVector<QSslEllipticCurve> &curves);
static void setDefaultEllipticCurves(const QVector<QSslEllipticCurve> &curves);
static QVector<QSslEllipticCurve> defaultEllipticCurves();
static QVector<QSslEllipticCurve> supportedEllipticCurves();
// CA settings. // CA settings.
bool addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, bool addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem,
QRegExp::PatternSyntax syntax = QRegExp::FixedString); QRegExp::PatternSyntax syntax = QRegExp::FixedString);
void addCaCertificate(const QSslCertificate &certificate); void addCaCertificate(const QSslCertificate &certificate);
void addCaCertificates(const QList<QSslCertificate> &certificates); void addCaCertificates(const QList<QSslCertificate> &certificates);
void setCaCertificates(const QList<QSslCertificate> &certificates); #if QT_DEPRECATED_SINCE(5, 5)
QList<QSslCertificate> caCertificates() const; QT_DEPRECATED_X("Use QSslConfiguration::setCaCertificates()") void setCaCertificates(const QList<QSslCertificate> &certificates);
QT_DEPRECATED_X("Use QSslConfiguration::caCertificates()") QList<QSslCertificate> caCertificates() const;
#endif // QT_DEPRECATED_SINCE(5, 5)
static bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, static bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem,
QRegExp::PatternSyntax syntax = QRegExp::FixedString); QRegExp::PatternSyntax syntax = QRegExp::FixedString);
static void addDefaultCaCertificate(const QSslCertificate &certificate); static void addDefaultCaCertificate(const QSslCertificate &certificate);
static void addDefaultCaCertificates(const QList<QSslCertificate> &certificates); static void addDefaultCaCertificates(const QList<QSslCertificate> &certificates);
static void setDefaultCaCertificates(const QList<QSslCertificate> &certificates); #if QT_DEPRECATED_SINCE(5, 5)
static QList<QSslCertificate> defaultCaCertificates(); QT_DEPRECATED static void setDefaultCaCertificates(const QList<QSslCertificate> &certificates);
static QList<QSslCertificate> systemCaCertificates(); QT_DEPRECATED static QList<QSslCertificate> defaultCaCertificates();
QT_DEPRECATED_X("Use QSslConfiguration::systemCaCertificates()") static QList<QSslCertificate> systemCaCertificates();
#endif // QT_DEPRECATED_SINCE(5, 5)
bool waitForConnected(int msecs = 30000) Q_DECL_OVERRIDE; bool waitForConnected(int msecs = 30000) Q_DECL_OVERRIDE;
bool waitForEncrypted(int msecs = 30000); bool waitForEncrypted(int msecs = 30000);

View File

@ -1685,7 +1685,7 @@ QList<QSslError> QSslSocketBackendPrivate::verify(const QList<QSslCertificate> &
setDefaultCaCertificates(defaultCaCertificates() + systemCaCertificates()); setDefaultCaCertificates(defaultCaCertificates() + systemCaCertificates());
} }
foreach (const QSslCertificate &caCertificate, QSslSocket::defaultCaCertificates()) { foreach (const QSslCertificate &caCertificate, QSslConfiguration::defaultConfiguration().caCertificates()) {
// From https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html: // From https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html:
// //
// If several CA certificates matching the name, key identifier, and // If several CA certificates matching the name, key identifier, and

View File

@ -137,9 +137,7 @@ public:
static void setDefaultSupportedCiphers(const QList<QSslCipher> &ciphers); static void setDefaultSupportedCiphers(const QList<QSslCipher> &ciphers);
static void resetDefaultCiphers(); static void resetDefaultCiphers();
static QVector<QSslEllipticCurve> defaultEllipticCurves();
static QVector<QSslEllipticCurve> supportedEllipticCurves(); static QVector<QSslEllipticCurve> supportedEllipticCurves();
static void setDefaultEllipticCurves(const QVector<QSslEllipticCurve> &curves);
static void setDefaultSupportedEllipticCurves(const QVector<QSslEllipticCurve> &curves); static void setDefaultSupportedEllipticCurves(const QVector<QSslEllipticCurve> &curves);
static void resetDefaultEllipticCurves(); static void resetDefaultEllipticCurves();

View File

@ -42,6 +42,7 @@
#include "QtGui/qaccessible.h" #include "QtGui/qaccessible.h"
#include <QtCore/qmath.h> #include <QtCore/qmath.h>
#include <QtCore/private/qjnihelpers_p.h> #include <QtCore/private/qjnihelpers_p.h>
#include <QtCore/private/qjni_p.h>
#include "qdebug.h" #include "qdebug.h"
@ -65,6 +66,15 @@ namespace QtAndroidAccessibility
static jmethodID m_setTextSelectionMethodID = 0; static jmethodID m_setTextSelectionMethodID = 0;
static jmethodID m_setVisibleToUserMethodID = 0; static jmethodID m_setVisibleToUserMethodID = 0;
void initialize()
{
// API level > 16 is required.
if (QtAndroidPrivate::androidSdkVersion() < 16)
return;
QJNIObjectPrivate::callStaticMethod<void>(QtAndroid::applicationClass(),
"initializeAccessibility");
}
static void setActive(JNIEnv */*env*/, jobject /*thiz*/, jboolean active) static void setActive(JNIEnv */*env*/, jobject /*thiz*/, jboolean active)
{ {

View File

@ -40,6 +40,7 @@ QT_BEGIN_NAMESPACE
namespace QtAndroidAccessibility namespace QtAndroidAccessibility
{ {
void initialize();
bool registerNatives(JNIEnv *env); bool registerNatives(JNIEnv *env);
} }

View File

@ -33,11 +33,14 @@
#include "qandroidplatformaccessibility.h" #include "qandroidplatformaccessibility.h"
#include "androidjniaccessibility.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
QAndroidPlatformAccessibility::QAndroidPlatformAccessibility() QAndroidPlatformAccessibility::QAndroidPlatformAccessibility()
{} {
QtAndroidAccessibility::initialize();
}
QAndroidPlatformAccessibility::~QAndroidPlatformAccessibility() QAndroidPlatformAccessibility::~QAndroidPlatformAccessibility()
{} {}

View File

@ -148,6 +148,10 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList &para
m_androidSystemLocale = new QAndroidSystemLocale; m_androidSystemLocale = new QAndroidSystemLocale;
#ifndef QT_NO_ACCESSIBILITY
m_accessibility = new QAndroidPlatformAccessibility();
#endif // QT_NO_ACCESSIBILITY
QJNIObjectPrivate javaActivity(QtAndroid::activity()); QJNIObjectPrivate javaActivity(QtAndroid::activity());
if (javaActivity.isValid()) { if (javaActivity.isValid()) {
QJNIObjectPrivate resources = javaActivity.callObjectMethod("getResources", "()Landroid/content/res/Resources;"); QJNIObjectPrivate resources = javaActivity.callObjectMethod("getResources", "()Landroid/content/res/Resources;");
@ -348,8 +352,6 @@ void QAndroidPlatformIntegration::setScreenOrientation(Qt::ScreenOrientation cur
#ifndef QT_NO_ACCESSIBILITY #ifndef QT_NO_ACCESSIBILITY
QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const
{ {
if (!m_accessibility)
m_accessibility = new QAndroidPlatformAccessibility();
return m_accessibility; return m_accessibility;
} }
#endif #endif

View File

@ -51,7 +51,6 @@ public:
virtual ~QCocoaFileDialogHelper(); virtual ~QCocoaFileDialogHelper();
void exec() Q_DECL_OVERRIDE; void exec() Q_DECL_OVERRIDE;
void execModalForWindow(QWindow *parent) Q_DECL_OVERRIDE;
bool defaultNameFilterDisables() const Q_DECL_OVERRIDE; bool defaultNameFilterDisables() const Q_DECL_OVERRIDE;

View File

@ -254,22 +254,17 @@ static QString strippedText(QString s)
|| [self panel:nil shouldShowFilename:filepath]; || [self panel:nil shouldShowFilename:filepath];
[self updateProperties]; [self updateProperties];
QCocoaMenuBar::redirectKnownMenuItemsToFirstResponder();
[mSavePanel setDirectoryURL: [NSURL fileURLWithPath:mCurrentDir]]; [mSavePanel setDirectoryURL: [NSURL fileURLWithPath:mCurrentDir]];
[mSavePanel setNameFieldStringValue:selectable ? QCFString::toNSString(info.fileName()) : @""]; [mSavePanel setNameFieldStringValue:selectable ? QCFString::toNSString(info.fileName()) : @""];
NSWindow *nsparent = static_cast<NSWindow *>(qGuiApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parent)); NSWindow *nsparent = static_cast<NSWindow *>(qGuiApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parent));
qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
QCocoaMenuBar::redirectKnownMenuItemsToFirstResponder();
[mSavePanel beginSheetModalForWindow:nsparent completionHandler:^(NSInteger result){ [mSavePanel beginSheetModalForWindow:nsparent completionHandler:^(NSInteger result){
[[NSApplication sharedApplication] stopModalWithCode:result]; mReturnCode = result;
if (mHelper)
mHelper->QNSOpenSavePanelDelegate_panelClosed(result == NSOKButton);
}]; }];
mReturnCode = [[NSApplication sharedApplication] runModalForWindow:nsparent];
QAbstractEventDispatcher::instance()->interrupt();
if (mHelper)
mHelper->QNSOpenSavePanelDelegate_panelClosed(mReturnCode == NSOKButton);
} }
- (BOOL)isHiddenFile:(NSString *)filename isDir:(BOOL)isDir - (BOOL)isHiddenFile:(NSString *)filename isDir:(BOOL)isDir
@ -711,15 +706,14 @@ void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate()
bool QCocoaFileDialogHelper::showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent) bool QCocoaFileDialogHelper::showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent)
{ {
Q_UNUSED(parent)
createNSOpenSavePanelDelegate(); createNSOpenSavePanelDelegate();
if (!mDelegate) if (!mDelegate)
return false; return false;
if (windowModality == Qt::NonModal) if (windowModality == Qt::NonModal)
[mDelegate showModelessPanel]; [mDelegate showModelessPanel];
// no need to show a Qt::ApplicationModal dialog here, since it will be done in exec; else if (windowModality == Qt::WindowModal && parent)
// Qt::WindowModal will be done in execModalForWindow. [mDelegate showWindowModalSheet:parent];
// no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel()
return true; return true;
} }
@ -751,14 +745,6 @@ void QCocoaFileDialogHelper::exec()
} }
void QCocoaFileDialogHelper::execModalForWindow(QWindow *parent)
{
if (!parent)
return exec();
[mDelegate showWindowModalSheet:parent];
}
bool QCocoaFileDialogHelper::defaultNameFilterDisables() const bool QCocoaFileDialogHelper::defaultNameFilterDisables() const
{ {
return true; return true;

View File

@ -446,6 +446,7 @@ QT_END_NAMESPACE
-(void)dealloc { -(void)dealloc {
[[NSStatusBar systemStatusBar] removeStatusItem:item]; [[NSStatusBar systemStatusBar] removeStatusItem:item];
[[NSNotificationCenter defaultCenter] removeObserver:imageCell];
[imageCell release]; [imageCell release];
[item release]; [item release];
[super dealloc]; [super dealloc];

View File

@ -749,7 +749,7 @@ void QCocoaWindow::setVisible(bool visible)
monitor = nil; monitor = nil;
} }
if (window()->type() == Qt::Popup) if (window()->type() == Qt::Popup || window()->type() == Qt::ToolTip)
QCocoaIntegration::instance()->popupWindowStack()->removeAll(this); QCocoaIntegration::instance()->popupWindowStack()->removeAll(this);
if (parentCocoaWindow && window()->type() == Qt::Popup) { if (parentCocoaWindow && window()->type() == Qt::Popup) {

View File

@ -1913,8 +1913,9 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers: [[NSApp currentEvent] modifierFlags]]; QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers: [[NSApp currentEvent] modifierFlags]];
QPlatformDragQtResponse response(false, Qt::IgnoreAction, QRect()); QPlatformDragQtResponse response(false, Qt::IgnoreAction, QRect());
if ([sender draggingSource] != nil) { QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); if (nativeDrag->currentDrag()) {
// The drag was started from within the application
response = QWindowSystemInterface::handleDrag(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); response = QWindowSystemInterface::handleDrag(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed);
[self updateCursorFromDragResponse:response drag:nativeDrag]; [self updateCursorFromDragResponse:response drag:nativeDrag];
} else { } else {
@ -1950,8 +1951,9 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations([sender draggingSourceOperationMask]); Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations([sender draggingSourceOperationMask]);
QPlatformDropQtResponse response(false, Qt::IgnoreAction); QPlatformDropQtResponse response(false, Qt::IgnoreAction);
if ([sender draggingSource] != nil) { QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); if (nativeDrag->currentDrag()) {
// The drag was started from within the application
response = QWindowSystemInterface::handleDrop(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); response = QWindowSystemInterface::handleDrop(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed);
} else { } else {
QCocoaDropData mimeData([sender draggingPasteboard]); QCocoaDropData mimeData([sender draggingPasteboard]);

View File

@ -626,7 +626,7 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,
const QPlatformDropQtResponse response = const QPlatformDropQtResponse response =
QWindowSystemInterface::handleDrop(m_window, windowsDrag->dropData(), QWindowSystemInterface::handleDrop(m_window, windowsDrag->dropData(),
m_lastPoint / QWindowsScaling::factor(), m_lastPoint / QWindowsScaling::factor(),
translateToQDragDropActions(m_chosenEffect)); translateToQDragDropActions(*pdwEffect));
if (response.isAccepted()) { if (response.isAccepted()) {
const Qt::DropAction action = response.acceptedAction(); const Qt::DropAction action = response.acceptedAction();

View File

@ -373,11 +373,11 @@ QDpi QXcbScreen::logicalDpi() const
if (overrideDpi) if (overrideDpi)
return QDpi(overrideDpi, overrideDpi); return QDpi(overrideDpi, overrideDpi);
if (m_forcedDpi > 0) { int primaryDpr = int(connection()->screens().at(0)->devicePixelRatio());
int primaryDpr = int(connection()->screens().at(0)->devicePixelRatio()); if (m_forcedDpi > 0)
return QDpi(m_forcedDpi/primaryDpr, m_forcedDpi/primaryDpr); return QDpi(m_forcedDpi/primaryDpr, m_forcedDpi/primaryDpr);
} QDpi vDpi = virtualDpi();
return virtualDpi(); return QDpi(vDpi.first/primaryDpr, vDpi.second/primaryDpr);
} }

View File

@ -2812,36 +2812,39 @@ static inline bool isWindowsBuildDirectory(const QString &dirName)
#endif #endif
/*! /*!
Extract a directory from resources to disk. The content is extracted Extracts a directory from resources to disk. The content is extracted
recursively to a temporary folder. The extracted content is not removed recursively to a temporary folder. The extracted content is removed
automatically. automatically once the last reference to the return value goes out of scope.
\a dirName is the name of the directory to extract from resources. \a dirName is the name of the directory to extract from resources.
Returns the path where the data was extracted or an empty string in case of Returns the temporary directory where the data was extracted or null in case of
errors. errors.
*/ */
QString QTest::qExtractTestData(const QString &dirName) QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName)
{ {
QTemporaryDir temporaryDir; QSharedPointer<QTemporaryDir> result; // null until success, then == tempDir
temporaryDir.setAutoRemove(false);
if (!temporaryDir.isValid()) QSharedPointer<QTemporaryDir> tempDir = QSharedPointer<QTemporaryDir>::create();
return QString();
const QString dataPath = temporaryDir.path(); tempDir->setAutoRemove(true);
if (!tempDir->isValid())
return result;
const QString dataPath = tempDir->path();
const QString resourcePath = QLatin1Char(':') + dirName; const QString resourcePath = QLatin1Char(':') + dirName;
const QFileInfo fileInfo(resourcePath); const QFileInfo fileInfo(resourcePath);
if (!fileInfo.isDir()) { if (!fileInfo.isDir()) {
qWarning("Resource path '%s' is not a directory.", qPrintable(resourcePath)); qWarning("Resource path '%s' is not a directory.", qPrintable(resourcePath));
return QString(); return result;
} }
QDirIterator it(resourcePath, QDirIterator::Subdirectories); QDirIterator it(resourcePath, QDirIterator::Subdirectories);
if (!it.hasNext()) { if (!it.hasNext()) {
qWarning("Resource directory '%s' is empty.", qPrintable(resourcePath)); qWarning("Resource directory '%s' is empty.", qPrintable(resourcePath));
return QString(); return result;
} }
while (it.hasNext()) { while (it.hasNext()) {
@ -2850,21 +2853,23 @@ QString QTest::qExtractTestData(const QString &dirName)
QFileInfo fileInfo = it.fileInfo(); QFileInfo fileInfo = it.fileInfo();
if (!fileInfo.isDir()) { if (!fileInfo.isDir()) {
const QString destination = dataPath + QLatin1Char('/') + fileInfo.filePath().mid(resourcePath.length()); const QString destination = dataPath + QLatin1Char('/') + fileInfo.filePath().midRef(resourcePath.length());
QFileInfo destinationFileInfo(destination); QFileInfo destinationFileInfo(destination);
QDir().mkpath(destinationFileInfo.path()); QDir().mkpath(destinationFileInfo.path());
if (!QFile::copy(fileInfo.filePath(), destination)) { if (!QFile::copy(fileInfo.filePath(), destination)) {
qWarning("Failed to copy '%s'.", qPrintable(fileInfo.filePath())); qWarning("Failed to copy '%s'.", qPrintable(fileInfo.filePath()));
return QString(); return result;
} }
if (!QFile::setPermissions(destination, QFile::ReadUser | QFile::WriteUser | QFile::ReadGroup)) { if (!QFile::setPermissions(destination, QFile::ReadUser | QFile::WriteUser | QFile::ReadGroup)) {
qWarning("Failed to set permissions on '%s'.", qPrintable(destination)); qWarning("Failed to set permissions on '%s'.", qPrintable(destination));
return QString(); return result;
} }
} }
} }
return dataPath; result = qMove(tempDir);
return result;
} }
/*! \internal /*! \internal

View File

@ -40,6 +40,8 @@
#include <QtCore/qnamespace.h> #include <QtCore/qnamespace.h>
#include <QtCore/qmetatype.h> #include <QtCore/qmetatype.h>
#include <QtCore/qtypetraits.h> #include <QtCore/qtypetraits.h>
#include <QtCore/qsharedpointer.h>
#include <QtCore/qtemporarydir.h>
#include <string.h> #include <string.h>
@ -250,7 +252,7 @@ namespace QTest
Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern); Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const QRegularExpression &messagePattern);
#endif #endif
Q_TESTLIB_EXPORT QString qExtractTestData(const QString &dirName); Q_TESTLIB_EXPORT QSharedPointer<QTemporaryDir> qExtractTestData(const QString &dirName);
Q_TESTLIB_EXPORT QString qFindTestData(const char* basepath, const char* file = 0, int line = 0, const char* builddir = 0); Q_TESTLIB_EXPORT QString qFindTestData(const char* basepath, const char* file = 0, int line = 0, const char* builddir = 0);
Q_TESTLIB_EXPORT QString qFindTestData(const QString& basepath, const char* file = 0, int line = 0, const char* builddir = 0); Q_TESTLIB_EXPORT QString qFindTestData(const QString& basepath, const char* file = 0, int line = 0, const char* builddir = 0);

View File

@ -4457,6 +4457,7 @@ void HtmlGenerator::generateManifestFile(const QString &manifest, const QString
writer.writeAttribute("module", project); writer.writeAttribute("module", project);
writer.writeStartElement(manifest); writer.writeStartElement(manifest);
QStringList usedAttributes;
i = exampleNodeMap.begin(); i = exampleNodeMap.begin();
while (i != exampleNodeMap.end()) { while (i != exampleNodeMap.end()) {
const ExampleNode* en = i.value(); const ExampleNode* en = i.value();
@ -4470,6 +4471,10 @@ void HtmlGenerator::generateManifestFile(const QString &manifest, const QString
++i; ++i;
continue; continue;
} }
// attributes that are always written for the element
usedAttributes.clear();
usedAttributes << "name" << "docUrl" << "projectPath";
writer.writeStartElement(element); writer.writeStartElement(element);
writer.writeAttribute("name", en->title()); writer.writeAttribute("name", en->title());
QString docUrl = manifestDir + fileBase(en) + ".html"; QString docUrl = manifestDir + fileBase(en) + ".html";
@ -4503,8 +4508,10 @@ void HtmlGenerator::generateManifestFile(const QString &manifest, const QString
writer.writeAttribute("projectPath", examplesPath + proFiles[0]); writer.writeAttribute("projectPath", examplesPath + proFiles[0]);
} }
} }
if (!en->imageFileName().isEmpty()) if (!en->imageFileName().isEmpty()) {
writer.writeAttribute("imageUrl", manifestDir + en->imageFileName()); writer.writeAttribute("imageUrl", manifestDir + en->imageFileName());
usedAttributes << "imageUrl";
}
QString fullName = project + QLatin1Char('/') + en->title(); QString fullName = project + QLatin1Char('/') + en->title();
QSet<QString> tags; QSet<QString> tags;
@ -4530,7 +4537,10 @@ void HtmlGenerator::generateManifestFile(const QString &manifest, const QString
if (attrList.count() == 1) if (attrList.count() == 1)
attrList.append(QStringLiteral("true")); attrList.append(QStringLiteral("true"));
QString attrName = attrList.takeFirst(); QString attrName = attrList.takeFirst();
writer.writeAttribute(attrName, attrList.join(div)); if (!usedAttributes.contains(attrName)) {
writer.writeAttribute(attrName, attrList.join(div));
usedAttributes << attrName;
}
} }
} }
} }

View File

@ -534,10 +534,7 @@ int QDialog::exec()
QPointer<QDialog> guard = this; QPointer<QDialog> guard = this;
if (d->nativeDialogInUse) { if (d->nativeDialogInUse) {
if (windowModality() == Qt::WindowModal) d->platformHelper()->exec();
d->platformHelper()->execModalForWindow(d->parentWindow());
else
d->platformHelper()->exec();
} else { } else {
QEventLoop eventLoop; QEventLoop eventLoop;
d->eventLoop = &eventLoop; d->eventLoop = &eventLoop;

View File

@ -332,14 +332,11 @@ QSpacerItem * QSpacerItem::spacerItem()
} }
/*! /*!
\fn QSizePolicy QSpacerItem::sizePolicy() const
\since 5.5 \since 5.5
Returns the size policy of this item. Returns the size policy of this item.
*/ */
QSizePolicy QSpacerItem::sizePolicy() const
{
return sizeP;
}
/*! /*!
If this item is a QWidget, it is returned as a QWidget; otherwise If this item is a QWidget, it is returned as a QWidget; otherwise

View File

@ -102,7 +102,7 @@ public:
void setGeometry(const QRect&); void setGeometry(const QRect&);
QRect geometry() const; QRect geometry() const;
QSpacerItem *spacerItem(); QSpacerItem *spacerItem();
QSizePolicy sizePolicy() const; QSizePolicy sizePolicy() const { return sizeP; }
private: private:
int width; int width;

View File

@ -263,21 +263,23 @@ private slots:
private: private:
const QString m_currentDir; const QString m_currentDir;
QString m_dataPath;
QString m_sourceFile; QString m_sourceFile;
QString m_proFile; QString m_proFile;
QString m_resourcesDir; QString m_resourcesDir;
QTemporaryDir m_dir; QTemporaryDir m_dir;
QSharedPointer<QTemporaryDir> m_dataDir;
}; };
void tst_QFileInfo::initTestCase() void tst_QFileInfo::initTestCase()
{ {
m_dataPath = QEXTRACTTESTDATA("/testdata"); m_dataDir = QEXTRACTTESTDATA("/testdata");
QVERIFY(!m_dataPath.isEmpty()); QVERIFY(m_dataDir);
const QString dataPath = m_dataDir->path();
QVERIFY(!dataPath.isEmpty());
m_sourceFile = m_dataPath + QStringLiteral("/tst_qfileinfo.cpp"); m_sourceFile = dataPath + QLatin1String("/tst_qfileinfo.cpp");
m_resourcesDir = m_dataPath + QStringLiteral("/resources"); m_resourcesDir = dataPath + QLatin1String("/resources");
m_proFile = m_dataPath + QStringLiteral("/tst_qfileinfo.pro"); m_proFile = dataPath + QLatin1String("/tst_qfileinfo.pro");
QVERIFY(m_dir.isValid()); QVERIFY(m_dir.isValid());
QVERIFY(QDir::setCurrent(m_dir.path())); QVERIFY(QDir::setCurrent(m_dir.path()));
@ -286,7 +288,6 @@ void tst_QFileInfo::initTestCase()
void tst_QFileInfo::cleanupTestCase() void tst_QFileInfo::cleanupTestCase()
{ {
QDir::setCurrent(m_currentDir); // Release temporary directory so that it can be deleted on Windows QDir::setCurrent(m_currentDir); // Release temporary directory so that it can be deleted on Windows
QDir(m_dataPath).removeRecursively();
} }
// Testing get/set functions // Testing get/set functions

View File

@ -61,9 +61,9 @@ void tst_QStorageInfo::defaultValues()
QVERIFY(!storage.isRoot()); QVERIFY(!storage.isRoot());
QVERIFY(storage.device().isEmpty()); QVERIFY(storage.device().isEmpty());
QVERIFY(storage.fileSystemType().isEmpty()); QVERIFY(storage.fileSystemType().isEmpty());
QVERIFY(storage.bytesTotal() == 0); QVERIFY(storage.bytesTotal() == -1);
QVERIFY(storage.bytesFree() == 0); QVERIFY(storage.bytesFree() == -1);
QVERIFY(storage.bytesAvailable() == 0); QVERIFY(storage.bytesAvailable() == -1);
} }
void tst_QStorageInfo::operatorEqual() void tst_QStorageInfo::operatorEqual()
@ -106,9 +106,9 @@ void tst_QStorageInfo::root()
QVERIFY(!storage.device().isEmpty()); QVERIFY(!storage.device().isEmpty());
QVERIFY(!storage.fileSystemType().isEmpty()); QVERIFY(!storage.fileSystemType().isEmpty());
#ifndef Q_OS_HAIKU #ifndef Q_OS_HAIKU
QVERIFY(storage.bytesTotal() > 0); QVERIFY(storage.bytesTotal() >= 0);
QVERIFY(storage.bytesFree() > 0); QVERIFY(storage.bytesFree() >= 0);
QVERIFY(storage.bytesAvailable() > 0); QVERIFY(storage.bytesAvailable() >= 0);
#endif #endif
} }
@ -121,9 +121,9 @@ void tst_QStorageInfo::currentStorage()
QVERIFY(appPath.startsWith(storage.rootPath(), Qt::CaseInsensitive)); QVERIFY(appPath.startsWith(storage.rootPath(), Qt::CaseInsensitive));
QVERIFY(!storage.device().isEmpty()); QVERIFY(!storage.device().isEmpty());
QVERIFY(!storage.fileSystemType().isEmpty()); QVERIFY(!storage.fileSystemType().isEmpty());
QVERIFY(storage.bytesTotal() > 0); QVERIFY(storage.bytesTotal() >= 0);
QVERIFY(storage.bytesFree() > 0); QVERIFY(storage.bytesFree() >= 0);
QVERIFY(storage.bytesAvailable() > 0); QVERIFY(storage.bytesAvailable() >= 0);
} }
void tst_QStorageInfo::storageList() void tst_QStorageInfo::storageList()

View File

@ -81,7 +81,7 @@ private slots:
void readLineMaxlen_data(); void readLineMaxlen_data();
void readLineMaxlen(); void readLineMaxlen();
void readLinesFromBufferCRCR(); void readLinesFromBufferCRCR();
void readLineOverload(); void readLineInto();
// all // all
void readAllFromDevice_data(); void readAllFromDevice_data();
@ -612,22 +612,22 @@ protected:
} }
}; };
void tst_QTextStream::readLineOverload() void tst_QTextStream::readLineInto()
{ {
QByteArray data = "1\n2\n3"; QByteArray data = "1\n2\n3";
QTextStream ts(&data); QTextStream ts(&data);
QString line; QString line;
ts.readLine(&line); ts.readLineInto(&line);
QCOMPARE(line, QStringLiteral("1")); QCOMPARE(line, QStringLiteral("1"));
ts.readLine(Q_NULLPTR, 0); // read the second line, but don't store it ts.readLineInto(Q_NULLPTR, 0); // read the second line, but don't store it
ts.readLine(&line); ts.readLineInto(&line);
QCOMPARE(line, QStringLiteral("3")); QCOMPARE(line, QStringLiteral("3"));
QVERIFY(!ts.readLine(&line)); QVERIFY(!ts.readLineInto(&line));
QVERIFY(line.isEmpty()); QVERIFY(line.isEmpty());
QFile file(m_rfc3261FilePath); QFile file(m_rfc3261FilePath);
@ -637,7 +637,7 @@ void tst_QTextStream::readLineOverload()
line.reserve(1); line.reserve(1);
int maxLineCapacity = line.capacity(); int maxLineCapacity = line.capacity();
while (ts.readLine(&line)) { while (ts.readLineInto(&line)) {
QVERIFY(line.capacity() >= maxLineCapacity); QVERIFY(line.capacity() >= maxLineCapacity);
maxLineCapacity = line.capacity(); maxLineCapacity = line.capacity();
} }
@ -647,7 +647,7 @@ void tst_QTextStream::readLineOverload()
QVERIFY(errorDevice.open(QIODevice::ReadOnly)); QVERIFY(errorDevice.open(QIODevice::ReadOnly));
ts.setDevice(&errorDevice); ts.setDevice(&errorDevice);
QVERIFY(!ts.readLine(&line)); QVERIFY(!ts.readLineInto(&line));
QVERIFY(line.isEmpty()); QVERIFY(line.isEmpty());
} }
@ -1025,7 +1025,7 @@ void tst_QTextStream::performance()
QTextStream stream2(&file3); QTextStream stream2(&file3);
QString line; QString line;
while (stream2.readLine(&line)) while (stream2.readLineInto(&line))
++nlines3; ++nlines3;
elapsed[2] = stopWatch.elapsed(); elapsed[2] = stopWatch.elapsed();

View File

@ -34,7 +34,7 @@
#include <QtTest/QtTest> #include <QtTest/QtTest>
#include <QSslEllipticCurve> #include <QSslEllipticCurve>
#include <QSslSocket> #include <QSslConfiguration>
class tst_QSslEllipticCurve : public QObject class tst_QSslEllipticCurve : public QObject
{ {
@ -84,7 +84,7 @@ void tst_QSslEllipticCurve::fromShortName_data()
QTest::newRow("QString()") << QString() << QSslEllipticCurve() << false; QTest::newRow("QString()") << QString() << QSslEllipticCurve() << false;
QTest::newRow("\"\"") << QString("") << QSslEllipticCurve() << false; QTest::newRow("\"\"") << QString("") << QSslEllipticCurve() << false;
QTest::newRow("does-not-exist") << QStringLiteral("does-not-exist") << QSslEllipticCurve() << false; QTest::newRow("does-not-exist") << QStringLiteral("does-not-exist") << QSslEllipticCurve() << false;
Q_FOREACH (QSslEllipticCurve ec, QSslSocket::supportedEllipticCurves()) { Q_FOREACH (QSslEllipticCurve ec, QSslConfiguration::supportedEllipticCurves()) {
const QString sN = ec.shortName(); const QString sN = ec.shortName();
QTest::newRow(qPrintable("supported EC \"" + sN + '"')) << sN << ec << true; QTest::newRow(qPrintable("supported EC \"" + sN + '"')) << sN << ec << true;
// At least in the OpenSSL impl, the short name is case-sensitive. That feels odd. // At least in the OpenSSL impl, the short name is case-sensitive. That feels odd.
@ -117,7 +117,7 @@ void tst_QSslEllipticCurve::fromLongName_data()
QTest::newRow("QString()") << QString() << QSslEllipticCurve() << false; QTest::newRow("QString()") << QString() << QSslEllipticCurve() << false;
QTest::newRow("\"\"") << QString("") << QSslEllipticCurve() << false; QTest::newRow("\"\"") << QString("") << QSslEllipticCurve() << false;
QTest::newRow("does-not-exist") << QStringLiteral("does-not-exist") << QSslEllipticCurve() << false; QTest::newRow("does-not-exist") << QStringLiteral("does-not-exist") << QSslEllipticCurve() << false;
Q_FOREACH (QSslEllipticCurve ec, QSslSocket::supportedEllipticCurves()) { Q_FOREACH (QSslEllipticCurve ec, QSslConfiguration::supportedEllipticCurves()) {
const QString lN = ec.longName(); const QString lN = ec.longName();
QTest::newRow(qPrintable("supported EC \"" + lN + '"')) << lN << ec << true; QTest::newRow(qPrintable("supported EC \"" + lN + '"')) << lN << ec << true;
} }

View File

@ -129,7 +129,7 @@ QDebug operator<<(QDebug dbg, AXErrorTag err)
- (AXUIElementRef) ref { return reference; } - (AXUIElementRef) ref { return reference; }
- (void) print { - (void) print {
NSLog(@"Accessible Object role: '%@', title: '%@', description: '%@', value: '%@', rect: '%@'", self.role, self.title, self.description, self.value, NSStringFromRect(self.rect)); NSLog(@"Accessible Object role: '%@', title: '%@', description: '%@', value: '%@', rect: '%@'", self.role, self.title, self.description, self.value, NSStringFromRect(NSRectFromCGRect(self.rect)));
NSLog(@" Children: %ld", [[self childList] count]); NSLog(@" Children: %ld", [[self childList] count]);
} }