Merge "Merge remote-tracking branch 'origin/stable' into dev" into refs/staging/dev

This commit is contained in:
Frederik Gladhorn 2013-02-18 20:03:20 +01:00 committed by The Qt Project
commit 3654a4a3c1
83 changed files with 488 additions and 333 deletions

10
configure vendored
View File

@ -2815,8 +2815,14 @@ if [ -z "$QT_INSTALL_BINS" ]; then #default
fi fi
QT_INSTALL_BINS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_BINS"` QT_INSTALL_BINS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_BINS"`
if [ "$XPLATFORM_MINGW" = "yes" ]; then
QT_INSTALL_LIBEXECS_DIRNAME="lib"
else
QT_INSTALL_LIBEXECS_DIRNAME="libexec"
fi
if [ -z "$QT_INSTALL_LIBEXECS" ]; then #default if [ -z "$QT_INSTALL_LIBEXECS" ]; then #default
QT_INSTALL_LIBEXECS="$QT_INSTALL_ARCHDATA/libexec" #fallback QT_INSTALL_LIBEXECS="$QT_INSTALL_ARCHDATA/$$QT_INSTALL_LIBEXECS_DIRNAME" #fallback
fi fi
QT_INSTALL_LIBEXECS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_LIBEXECS"` QT_INSTALL_LIBEXECS=`"$relpath/config.tests/unix/makeabs" "$QT_INSTALL_LIBEXECS"`
@ -3038,7 +3044,7 @@ Installation options:
-plugindir <dir> ...... Plugins will be installed to <dir> -plugindir <dir> ...... Plugins will be installed to <dir>
(default ARCHDATADIR/plugins) (default ARCHDATADIR/plugins)
-libexecdir <dir> ..... Program executables will be installed to <dir> -libexecdir <dir> ..... Program executables will be installed to <dir>
(default ARCHDATADIR/libexec) (default ARCHDATADIR/$QT_INSTALL_LIBEXECS_DIRNAME)
-importdir <dir> ...... Imports for QML1 will be installed to <dir> -importdir <dir> ...... Imports for QML1 will be installed to <dir>
(default ARCHDATADIR/imports) (default ARCHDATADIR/imports)
-qmldir <dir> ......... Imports for QML2 will be installed to <dir> -qmldir <dir> ......... Imports for QML2 will be installed to <dir>

6
dist/changes-5.0.2 vendored
View File

@ -107,6 +107,12 @@ Qt for Windows CE
* Tools * * Tools *
**************************************************************************** ****************************************************************************
qmake
-----
- $$(VAR) style environment variable expansions will not split on
whitespace any more. Use $$split() if necessary.
**************************************************************************** ****************************************************************************
* Plugins * * Plugins *

View File

@ -0,0 +1,33 @@
# Additional meta information (attributes for matched entries, as well as tags)
# to be added to manifest.xml files.
#
# manifestmeta.filters = <filter1>,<filter2>,...
#
# manifestmeta.<filter>.names = <Module1>/<name1>,<Module2>/<name2>,..
# manifestmeta.<filter>.attributes = <attribute1:value1>,<attribute2:value2>,..
# manifestmeta.<filter>.tags = <tag1>,<tag2>,..
#
# <filter>.names specify all the module/name combinations to apply the
# attributes/tags to. You can use simple wildcard matching by appending
# '*' at the end of name.
#
# Note: You cannot use operators (+, =, -) in the names.
#
# Examples: add a 'isHighlighted' attribute for two 'Analog Clock' examples,
# add a 'database' tag for QtSql all examples, a 'webkit' tag for QtWebKit
# examples, and a 'qt5' tag for all examples
#
# manifestmeta.filters = highlighted sql webkit global
#
# manifestmeta.highlighted.names = "QtGui/Analog Clock Window Example" \
# "QtWidgets/Analog Clock Example"
# manifestmeta.highlighted.attributes = isHighlighted:true
#
# manifestmeta.sql.names = "QtSql/*"
# manifestmeta.sql.tags = database
#
# manifestmeta.webkit.names = "QtWebKitExamples/*"
# manifestmeta.webkit.tags = webkit
#
# manifestmeta.global.names = *
# manifestmeta.global.tags = qt5

View File

@ -3,6 +3,7 @@ include(qt-cpp-ignore.qdocconf)
include(qt-defines.qdocconf) include(qt-defines.qdocconf)
include(qt-html-templates-offline.qdocconf) include(qt-html-templates-offline.qdocconf)
include(compat.qdocconf) include(compat.qdocconf)
include(manifest-meta.qdocconf)
dita.metadata.default.author = Qt Project dita.metadata.default.author = Qt Project
dita.metadata.default.permissions = all dita.metadata.default.permissions = all

View File

@ -290,14 +290,10 @@ box-shadow: 0px 0px 0px #fff;
background-color: #F6F6F6; background-color: #F6F6F6;
border: 1px solid #E6E6E6; border: 1px solid #E6E6E6;
border-collapse: separate; border-collapse: separate;
font-size: 12px;
line-height: 1.2;
margin-bottom: 25px; margin-bottom: 25px;
margin-left: 15px; margin-left: 15px;
font-size: 12px; font-size: 12px;
line-height: 1.2; line-height: 1.2;
margin-bottom: 25px;
margin-left: 15px;
} }
@ -451,6 +447,9 @@ padding: 3px 5px 3px 10px;
text-align: right; text-align: right;
} }
.qmldoc {
margin-left: 15px;
}
/* /*
----------- -----------
Content table Content table

View File

@ -563,6 +563,10 @@ padding: 3px 5px 3px 10px;
text-align: right; text-align: right;
} }
.qmldoc {
margin-left: 15px;
}
/* /*
----------- -----------
Content table Content table

View File

@ -36,14 +36,24 @@ CMAKE_MODULE_DEPS = $$cmakeModuleList($$sort_depends(QT.$${MODULE}.depends, QT.)
CMAKE_PARTIAL_MODULE_DEPS = $$replace(CMAKE_MODULE_DEPS, ";", ";Qt5::") CMAKE_PARTIAL_MODULE_DEPS = $$replace(CMAKE_MODULE_DEPS, ";", ";Qt5::")
!isEmpty(CMAKE_PARTIAL_MODULE_DEPS):CMAKE_QT5_MODULE_DEPS = "Qt5::$${CMAKE_PARTIAL_MODULE_DEPS}" !isEmpty(CMAKE_PARTIAL_MODULE_DEPS):CMAKE_QT5_MODULE_DEPS = "Qt5::$${CMAKE_PARTIAL_MODULE_DEPS}"
# Several distros (ArchLinux, Fedora) have in the past installed libraries
# in /lib(64)?, but are now moving to install libraries in /usr/lib(64)?/.
# The /lib paths are made symlinks to the /usr/lib paths. If someone searching
# for a Qt 5 package finds it in /lib/cmake/Qt5Core, although it has been
# installed in /usr/lib/cmake/Qt5Core, relative paths to the includes and
# executables will not work. So, we treat installations to /usr as non-relocatable
# packages with absolute paths.
CMAKE_INSTALL_LIBS_DIR = $$[QT_INSTALL_LIBS]
contains(CMAKE_INSTALL_LIBS_DIR, ^(/usr)?/lib(64)?.*): CMAKE_FORCE_ABSOLUTE_PATHS = True
CMAKE_INCLUDE_DIR = $$cmakeRelativePath($$[QT_INSTALL_HEADERS], $$[QT_INSTALL_PREFIX]) CMAKE_INCLUDE_DIR = $$cmakeRelativePath($$[QT_INSTALL_HEADERS], $$[QT_INSTALL_PREFIX])
contains(CMAKE_INCLUDE_DIR, "^\\.\\./.*") { !isEmpty(CMAKE_FORCE_ABSOLUTE_PATHS)|contains(CMAKE_INCLUDE_DIR, "^\\.\\./.*") {
CMAKE_INCLUDE_DIR = $$[QT_INSTALL_HEADERS]/ CMAKE_INCLUDE_DIR = $$[QT_INSTALL_HEADERS]/
CMAKE_INCLUDE_DIR_IS_ABSOLUTE = True CMAKE_INCLUDE_DIR_IS_ABSOLUTE = True
} }
CMAKE_LIB_DIR = $$cmakeRelativePath($$[QT_INSTALL_LIBS], $$[QT_INSTALL_PREFIX]) CMAKE_LIB_DIR = $$cmakeRelativePath($$[QT_INSTALL_LIBS], $$[QT_INSTALL_PREFIX])
contains(CMAKE_LIB_DIR, "^\\.\\./.*") { !isEmpty(CMAKE_FORCE_ABSOLUTE_PATHS)|contains(CMAKE_LIB_DIR,"^\\.\\./.*") {
CMAKE_LIB_DIR = $$[QT_INSTALL_LIBS]/ CMAKE_LIB_DIR = $$[QT_INSTALL_LIBS]/
CMAKE_LIB_DIR_IS_ABSOLUTE = True CMAKE_LIB_DIR_IS_ABSOLUTE = True
} else { } else {
@ -54,13 +64,13 @@ contains(CMAKE_LIB_DIR, "^\\.\\./.*") {
} }
CMAKE_BIN_DIR = $$cmakeRelativePath($$[QT_HOST_BINS], $$[QT_INSTALL_PREFIX]) CMAKE_BIN_DIR = $$cmakeRelativePath($$[QT_HOST_BINS], $$[QT_INSTALL_PREFIX])
contains(CMAKE_BIN_DIR, "^\\.\\./.*") { !isEmpty(CMAKE_FORCE_ABSOLUTE_PATHS)|contains(CMAKE_BIN_DIR, "^\\.\\./.*") {
CMAKE_BIN_DIR = $$[QT_HOST_BINS]/ CMAKE_BIN_DIR = $$[QT_HOST_BINS]/
CMAKE_BIN_DIR_IS_ABSOLUTE = True CMAKE_BIN_DIR_IS_ABSOLUTE = True
} }
CMAKE_ARCHDATA_DIR = $$cmakeRelativePath($$[QT_INSTALL_ARCHDATA], $$[QT_INSTALL_PREFIX]) CMAKE_ARCHDATA_DIR = $$cmakeRelativePath($$[QT_INSTALL_ARCHDATA], $$[QT_INSTALL_PREFIX])
contains(CMAKE_ARCHDATA_DIR, "^\\.\\./.*") { # For the mkspecs !isEmpty(CMAKE_FORCE_ABSOLUTE_PATHS)|contains(CMAKE_ARCHDATA_DIR, "^\\.\\./.*") { # For the mkspecs
CMAKE_ARCHDATA_DIR = $$[QT_INSTALL_ARCHDATA]/ CMAKE_ARCHDATA_DIR = $$[QT_INSTALL_ARCHDATA]/
CMAKE_ARCHDATA_DIR_IS_ABSOLUTE = True CMAKE_ARCHDATA_DIR_IS_ABSOLUTE = True
} }

View File

@ -1,9 +1,6 @@
# fixExclusiveOutputDirs(1config, 2config) # fixExclusiveOutputDirs(1config, 2config)
# Change all output paths that references 2config to have the string 1config in them # Change all output paths that references 2config to have the string 1config in them
defineTest(fixExclusiveOutputDirs) { defineTest(fixExclusiveOutputDirs) {
unset(firstBuild)
unset(secondBuild)
unset(appendFirstBuild)
firstBuild = $$1 firstBuild = $$1
secondBuild = $$2 secondBuild = $$2
count(ARGS, 2, greaterThan):isEqual($$list($$lower($$3)), false):appendFirstBuild = false count(ARGS, 2, greaterThan):isEqual($$list($$lower($$3)), false):appendFirstBuild = false
@ -29,11 +26,6 @@ defineTest(fixExclusiveOutputDirs) {
# addExclusiveBuilds(1config, 1name, 2config, 2name) # addExclusiveBuilds(1config, 1name, 2config, 2name)
# Adds two BUILDS which are exclusive to each other. # Adds two BUILDS which are exclusive to each other.
defineTest(addExclusiveBuilds) { defineTest(addExclusiveBuilds) {
unset(firstBuild)
unset(firstBuildName)
unset(secondBuild)
unset(secondBuildName)
firstBuild = $$1 firstBuild = $$1
firstBuildName = $$2 firstBuildName = $$2
secondBuild = $$3 secondBuild = $$3

View File

@ -9,7 +9,6 @@ defineReplace(qtPlatformTargetSuffix) {
} }
defineReplace(qtLibraryTarget) { defineReplace(qtLibraryTarget) {
unset(LIBRARY_NAME)
LIBRARY_NAME = $$1 LIBRARY_NAME = $$1
mac:!static:contains(QT_CONFIG, qt_framework) { mac:!static:contains(QT_CONFIG, qt_framework) {
QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME

View File

@ -79,7 +79,7 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
#endif #endif
if (!project->isHostBuild()) { if (!project->isHostBuild()) {
const ProValueMap &variables = project->variables(); const ProValueMap &variables = project->variables();
if (variables["QMAKESPEC"].first().contains("wince", Qt::CaseInsensitive)) { if (project->isActiveConfig("wince")) {
CeSdkHandler sdkhandler; CeSdkHandler sdkhandler;
sdkhandler.parse(); sdkhandler.parse();
const QString sdkName = variables["CE_SDK"].join(' ') const QString sdkName = variables["CE_SDK"].join(' ')
@ -414,7 +414,8 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t)
<< cQuoted(unescapeFilePath(manifest)) << ">" << manifest_rc; << cQuoted(unescapeFilePath(manifest)) << ">" << manifest_rc;
if (generateManifest) { if (generateManifest) {
t << "\n\tif not exist $(DESTDIR_TARGET) del " << manifest << ">NUL 2>&1"; t << "\n\tif not exist $(DESTDIR_TARGET) if exist " << manifest
<< " del " << manifest;
t << "\n\tif exist " << manifest << " copy /Y " << manifest << ' ' << manifest_bak; t << "\n\tif exist " << manifest << " copy /Y " << manifest << ' ' << manifest_bak;
const QString extraInlineFileContent = "\n!IF EXIST(" + manifest_res + ")\n" + manifest_res + "\n!ENDIF"; const QString extraInlineFileContent = "\n!IF EXIST(" + manifest_res + ")\n" + manifest_res + "\n!ENDIF";
t << "\n\t"; t << "\n\t";

View File

@ -454,9 +454,9 @@ void QMakeEvaluator::evaluateExpression(
break; } break; }
case TokEnvVar: { case TokEnvVar: {
const ProString &var = getStr(tokPtr); const ProString &var = getStr(tokPtr);
const ProStringList &val = split_value_list(m_option->getEnv(var.toQString(m_tmp1))); const ProString &val = ProString(m_option->getEnv(var.toQString(m_tmp1)));
debugMsg(2, "env var %s => %s", dbgStr(var), dbgStrList(val)); debugMsg(2, "env var %s => %s", dbgStr(var), dbgStr(val));
addStrList(val, tok, ret, pending, joined); addStr(val, ret, pending, joined);
break; } break; }
case TokFuncName: { case TokFuncName: {
const ProKey &func = getHashStr(tokPtr); const ProKey &func = getHashStr(tokPtr);

View File

@ -15,17 +15,17 @@ win32-msvc2012 {
error("Cannot determine DirectX SDK location. Please set DXSDK_DIR environment variable.") error("Cannot determine DirectX SDK location. Please set DXSDK_DIR environment variable.")
} }
DXINC_DIR = $$quote($${DX_DIR}Include) DXINC_DIR = $${DX_DIR}Include
contains(QT_ARCH, x86_64) { contains(QT_ARCH, x86_64) {
DXLIB_DIR = $$quote($${DX_DIR}Lib\\x64) DXLIB_DIR = $${DX_DIR}Lib\\x64
} else { } else {
DXLIB_DIR = $$quote($${DX_DIR}Lib\\x86) DXLIB_DIR = $${DX_DIR}Lib\\x86
} }
equals(QMAKE_TARGET.arch, x86_64) { equals(QMAKE_TARGET.arch, x86_64) {
FXC = "\"$${DX_DIR}Utilities\\bin\\x64\\fxc.exe\"" FXC = \"$${DX_DIR}Utilities\\bin\\x64\\fxc.exe\"
} else { } else {
FXC = "\"$${DX_DIR}Utilities\\bin\\x86\\fxc.exe\"" FXC = \"$${DX_DIR}Utilities\\bin\\x86\\fxc.exe\"
} }
msvc { msvc {
@ -36,7 +36,7 @@ win32-msvc2012 {
# Similarly we want the MinGW linker to use the import libraries shipped with the compiler # Similarly we want the MinGW linker to use the import libraries shipped with the compiler
# instead of those from the SDK which cause a crash on startup. # instead of those from the SDK which cause a crash on startup.
LIBS += -L$$DXLIB_DIR LIBS += -L\"$$DXLIB_DIR\"
} }
} }

View File

@ -3,7 +3,7 @@
ANGLE_DIR = $$(ANGLE_DIR) ANGLE_DIR = $$(ANGLE_DIR)
isEmpty(ANGLE_DIR) { isEmpty(ANGLE_DIR) {
ANGLE_DIR = $$PWD/../../3rdparty/angle ANGLE_DIR = $$absolute_path(../../3rdparty/angle)
} else { } else {
!build_pass:message("Using external ANGLE from $$ANGLE_DIR") !build_pass:message("Using external ANGLE from $$ANGLE_DIR")
} }
@ -12,20 +12,19 @@ isEmpty(ANGLE_DIR) {
error("$$ANGLE_DIR does not contain ANGLE") error("$$ANGLE_DIR does not contain ANGLE")
} }
win32 { equals(QMAKE_HOST.os, Windows) {
GNUTOOLS_DIR=$$PWD/../../../../gnuwin32/bin gnutools.value = $$absolute_path(../../../../gnuwin32/bin)
exists($$GNUTOOLS_DIR/gperf.exe) { exists($$gnutools.value/gperf.exe) {
# Escape closing parens when expanding the variable, otherwise cmd confuses itself. gnutools.name = PATH
GNUTOOLS = "(set PATH=$$replace(GNUTOOLS_DIR, [/\\\\], $${QMAKE_DIR_SEP});%PATH:)=^)%)" gnutools.CONFIG = prepend
} }
} }
defineReplace(addGnuPath) { defineReplace(addGnuPath) {
unset(gnuPath)
gnuPath = $$1 gnuPath = $$1
!isEmpty(gnuPath):!isEmpty(GNUTOOLS) { !isEmpty(gnuPath):!isEmpty(gnutools.name) {
eval(gnuPath = $${GNUTOOLS} && $$gnuPath) qtAddToolEnv(gnuPath, gnutools)
silent: eval(gnuPath = @echo generating sources from ${QMAKE_FILE_IN} && $$val_escape($$gnuPath)) silent: gnuPath = @echo generating sources from ${QMAKE_FILE_IN} && $$gnuPath
} }
return($$gnuPath) return($$gnuPath)
} }

View File

@ -136,8 +136,11 @@ void QPropertyAnimationPrivate::updateProperty(const QVariant &newValue)
if (newValue.userType() == propertyType) { if (newValue.userType() == propertyType) {
//no conversion is needed, we directly call the QMetaObject::metacall //no conversion is needed, we directly call the QMetaObject::metacall
void *data = const_cast<void*>(newValue.constData()); //check QMetaProperty::write for an explanation of these
QMetaObject::metacall(targetValue, QMetaObject::WriteProperty, propertyIndex, &data); int status = -1;
int flags = 0;
void *argv[] = { const_cast<void *>(newValue.constData()), const_cast<QVariant *>(&newValue), &status, &flags };
QMetaObject::metacall(targetValue, QMetaObject::WriteProperty, propertyIndex, argv);
} else { } else {
targetValue->setProperty(propertyName.constData(), newValue); targetValue->setProperty(propertyName.constData(), newValue);
} }

View File

@ -39,6 +39,7 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef QT_NO_ACCESSIBILITY
#ifndef QACCESSIBLE_H #ifndef QACCESSIBLE_H
#define QACCESSIBLE_H #define QACCESSIBLE_H
@ -677,3 +678,4 @@ inline void QAccessible::updateAccessibility(QObject *object, int child, Event r
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QACCESSIBLE_H #endif // QACCESSIBLE_H
#endif //!QT_NO_ACCESSIBILITY

View File

@ -4944,7 +4944,10 @@ QPaintEngine *QImage::paintEngine() const
if (!d->paintEngine) { if (!d->paintEngine) {
QPaintDevice *paintDevice = const_cast<QImage *>(this); QPaintDevice *paintDevice = const_cast<QImage *>(this);
QPaintEngine *paintEngine = QGuiApplicationPrivate::platformIntegration()->createImagePaintEngine(paintDevice); QPaintEngine *paintEngine = 0;
QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration();
if (platformIntegration)
paintEngine = platformIntegration->createImagePaintEngine(paintDevice);
d->paintEngine = paintEngine ? paintEngine : new QRasterPaintEngine(paintDevice); d->paintEngine = paintEngine ? paintEngine : new QRasterPaintEngine(paintDevice);
} }

View File

@ -60,7 +60,9 @@
#include <QtCore/private/qthread_p.h> #include <QtCore/private/qthread_p.h>
#include <QtCore/qdir.h> #include <QtCore/qdir.h>
#include <QtDebug> #include <QtDebug>
#ifndef QT_NO_ACCESSIBILITY
#include "qaccessible.h" #include "qaccessible.h"
#endif
#include <qpalette.h> #include <qpalette.h>
#include <qscreen.h> #include <qscreen.h>
#include "qsessionmanager.h" #include "qsessionmanager.h"

View File

@ -686,25 +686,24 @@ void QOpenGLFramebufferObjectPrivate::initAttachments(QOpenGLContext *ctx, QOpen
\ingroup painting-3D \ingroup painting-3D
The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer
object, defined by the \c{GL_EXT_framebuffer_object} extension. In object, defined by the \c{GL_EXT_framebuffer_object} extension. It provides
addition it provides a rendering surface that can be painted on a rendering surface that can be painted on with a QPainter with the help of
with a QPainter, rendered to using native OpenGL calls, or both. This QOpenGLPaintDevice, or rendered to using native OpenGL calls. This surface
surface can be bound and used as a regular texture in your own OpenGL can be bound and used as a regular texture in your own OpenGL drawing code.
drawing code. By default, the QOpenGLFramebufferObject class By default, the QOpenGLFramebufferObject class generates a 2D OpenGL
generates a 2D OpenGL texture (using the \c{GL_TEXTURE_2D} target), texture (using the \c{GL_TEXTURE_2D} target), which is used as the internal
which is used as the internal rendering target. rendering target.
\b{It is important to have a current OpenGL context when creating a \b{It is important to have a current OpenGL context when creating a
QOpenGLFramebufferObject, otherwise initialization will fail.} QOpenGLFramebufferObject, otherwise initialization will fail.}
When using a QPainter to paint to a QOpenGLFramebufferObject you should take Create the QOpenGLFrameBufferObject instance with the CombinedDepthStencil
care that the QOpenGLFramebufferObject is created with the CombinedDepthStencil attachment if you want QPainter to render correctly. Note that you need to
attachment for QPainter to be able to render correctly. create a QOpenGLFramebufferObject with more than one sample per pixel for
Note that you need to create a QOpenGLFramebufferObject with more than one primitives to be antialiased when drawing using a QPainter. To create a
sample per pixel for primitives to be antialiased when drawing using a multisample framebuffer object you should use one of the constructors that
QPainter. To create a multisample framebuffer object you should use one of take a QOpenGLFramebufferObjectFormat parameter, and set the
the constructors that take a QOpenGLFramebufferObject parameter, and set the QOpenGLFramebufferObjectFormat::samples() property to a non-zero value.
QOpenGLFramebufferObject::samples() property to a non-zero value.
For multisample framebuffer objects a color render buffer is created, For multisample framebuffer objects a color render buffer is created,
otherwise a texture with the specified texture target is created. otherwise a texture with the specified texture target is created.
@ -716,11 +715,8 @@ void QOpenGLFramebufferObjectPrivate::initAttachments(QOpenGLContext *ctx, QOpen
as a texture, you first need to copy from it to a regular framebuffer as a texture, you first need to copy from it to a regular framebuffer
object using QOpenGLContext::blitFramebuffer(). object using QOpenGLContext::blitFramebuffer().
\section1 Threading It is possible to draw into a QOpenGLFramebufferObject using QPainter and
QOpenGLPaintDevice in a separate thread.
As of Qt 4.8, it's possible to draw into a QOpenGLFramebufferObject
using a QPainter in a separate thread. Note that OpenGL 2.0 or
OpenGL ES 2.0 is required for this to work.
*/ */

View File

@ -671,7 +671,7 @@ void QFontPrivate::detachButKeepEngineData(QFont *font)
\sa QGuiApplication::setFont(), QGuiApplication::font() \sa QGuiApplication::setFont(), QGuiApplication::font()
*/ */
QFont::QFont() QFont::QFont()
: d(QGuiApplication::font().d.data()), resolve_mask(0) : d(QGuiApplicationPrivate::instance() ? QGuiApplication::font().d.data() : new QFontPrivate()), resolve_mask(0)
{ {
} }

View File

@ -1283,7 +1283,7 @@ bool QTextCursor::movePosition(MoveOperation op, MoveMode mode, int n)
Returns true if the cursor does visual navigation; otherwise Returns true if the cursor does visual navigation; otherwise
returns false. returns false.
Visual navigation means skipping over hidden text pragraphs. The Visual navigation means skipping over hidden text paragraphs. The
default is false. default is false.
\sa setVisualNavigation(), movePosition() \sa setVisualNavigation(), movePosition()
@ -1298,7 +1298,7 @@ bool QTextCursor::visualNavigation() const
Sets visual navigation to \a b. Sets visual navigation to \a b.
Visual navigation means skipping over hidden text pragraphs. The Visual navigation means skipping over hidden text paragraphs. The
default is false. default is false.
\sa visualNavigation(), movePosition() \sa visualNavigation(), movePosition()

View File

@ -680,8 +680,13 @@ void QNetworkReply::ignoreSslErrorsImplementation(const QList<QSslError> &)
connection will be ignored, including certificate validation connection will be ignored, including certificate validation
errors. errors.
Note that calling this function without restraint may pose a \warning Be sure to always let the user inspect the errors
security risk for your application. Use it with care. reported by the sslErrors() signal, and only call this method
upon confirmation from the user that proceeding is ok.
If there are unexpected errors, the reply should be aborted.
Calling this method without inspecting the actual errors will
most likely pose a security risk for your application. Use it
with great care!
This function can be called from the slot connected to the This function can be called from the slot connected to the
sslErrors() signal, which indicates which errors were sslErrors() signal, which indicates which errors were

View File

@ -1714,9 +1714,13 @@ void QSslSocket::startServerEncryption()
will not emit the sslErrors() signal, and it is unnecessary to will not emit the sslErrors() signal, and it is unnecessary to
call this function. call this function.
Ignoring errors that occur during an SSL handshake should be done \warning Be sure to always let the user inspect the errors
with caution. A fundamental characteristic of secure connections reported by the sslErrors() signal, and only call this method
is that they should be established with an error free handshake. upon confirmation from the user that proceeding is ok.
If there are unexpected errors, the connection should be aborted.
Calling this method without inspecting the actual errors will
most likely pose a security risk for your application. Use it
with great care!
\sa sslErrors() \sa sslErrors()
*/ */

View File

@ -752,8 +752,8 @@ void QGLFramebufferObjectPrivate::init(QGLFramebufferObject *q, const QSize &sz,
Note that you need to create a QGLFramebufferObject with more than one Note that you need to create a QGLFramebufferObject with more than one
sample per pixel for primitives to be antialiased when drawing using a sample per pixel for primitives to be antialiased when drawing using a
QPainter. To create a multisample framebuffer object you should use one of QPainter. To create a multisample framebuffer object you should use one of
the constructors that take a QGLFramebufferObject parameter, and set the the constructors that take a QGLFramebufferObjectFormat parameter, and set
QGLFramebufferObject::samples() property to a non-zero value. the QGLFramebufferObjectFormat::samples() property to a non-zero value.
When painting to a QGLFramebufferObject using QPainter, the state of When painting to a QGLFramebufferObject using QPainter, the state of
the current GL context will be altered by the paint engine to reflect the current GL context will be altered by the paint engine to reflect

View File

@ -667,9 +667,8 @@ static QTouchDevice *touchDevice = 0;
} }
#endif #endif
QPoint qt_windowPoint, qt_screenPoint;
NSPoint windowPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil]; [self convertFromEvent:theEvent toWindowPoint:&qt_windowPoint andScreenPoint:&qt_screenPoint];
QPoint qt_windowPoint(windowPoint.x, windowPoint.y);
NSTimeInterval timestamp = [theEvent timestamp]; NSTimeInterval timestamp = [theEvent timestamp];
ulong qt_timestamp = timestamp * 1000; ulong qt_timestamp = timestamp * 1000;
@ -687,7 +686,7 @@ static QTouchDevice *touchDevice = 0;
currentWheelModifiers = [self convertKeyModifiers:[theEvent modifierFlags]]; currentWheelModifiers = [self convertKeyModifiers:[theEvent modifierFlags]];
} }
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, pixelDelta, angleDelta, currentWheelModifiers); QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta, currentWheelModifiers);
if (phase == NSEventPhaseEnded || phase == NSEventPhaseCancelled) { if (phase == NSEventPhaseEnded || phase == NSEventPhaseCancelled) {
currentWheelModifiers = Qt::NoModifier; currentWheelModifiers = Qt::NoModifier;
@ -695,7 +694,7 @@ static QTouchDevice *touchDevice = 0;
} else } else
#endif #endif
{ {
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_windowPoint, pixelDelta, angleDelta, QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta,
[self convertKeyModifiers:[theEvent modifierFlags]]); [self convertKeyModifiers:[theEvent modifierFlags]]);
} }
} }

View File

@ -136,6 +136,10 @@
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
#endif #endif
#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
#endif
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
template <class MaskType, class FlagType> inline bool testFlag(MaskType mask, FlagType flag) template <class MaskType, class FlagType> inline bool testFlag(MaskType mask, FlagType flag)
@ -696,34 +700,27 @@ QWindowsOpenGLContextFormat QWindowsOpenGLContextFormat::current()
result.version = (version.mid(0, majorDot).toInt() << 8) result.version = (version.mid(0, majorDot).toInt() << 8)
+ version.mid(majorDot + 1, minorDot - majorDot - 1).toInt(); + version.mid(majorDot + 1, minorDot - majorDot - 1).toInt();
} }
result.profile = QSurfaceFormat::NoProfile;
if (result.version < 0x0300) { if (result.version < 0x0300) {
result.profile = QSurfaceFormat::NoProfile;
result.options |= QSurfaceFormat::DeprecatedFunctions; result.options |= QSurfaceFormat::DeprecatedFunctions;
return result; return result;
} }
// v3 onwards // v3 onwards
GLint value = 0; GLint value = 0;
glGetIntegerv(GL_CONTEXT_FLAGS, &value); glGetIntegerv(GL_CONTEXT_FLAGS, &value);
if (value & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) if (!(value & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT))
result.options |= QSurfaceFormat::DeprecatedFunctions; result.options |= QSurfaceFormat::DeprecatedFunctions;
if (value & WGL_CONTEXT_DEBUG_BIT_ARB) if (value & GL_CONTEXT_FLAG_DEBUG_BIT)
result.options |= QSurfaceFormat::DebugContext; result.options |= QSurfaceFormat::DebugContext;
if (result.version < 0x0302) if (result.version < 0x0302)
return result; return result;
// v3.2 onwards: Profiles // v3.2 onwards: Profiles
value = 0; value = 0;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &value); glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &value);
switch (value) { if (value & GL_CONTEXT_CORE_PROFILE_BIT)
case WGL_CONTEXT_CORE_PROFILE_BIT_ARB:
result.profile = QSurfaceFormat::CoreProfile; result.profile = QSurfaceFormat::CoreProfile;
break; else if (value & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
case WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB:
result.profile = QSurfaceFormat::CompatibilityProfile; result.profile = QSurfaceFormat::CompatibilityProfile;
break;
default:
result.profile = QSurfaceFormat::NoProfile;
break;
}
return result; return result;
} }

View File

@ -75,6 +75,10 @@ typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXC
#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
#endif #endif
#ifndef GL_CONTEXT_FLAG_DEBUG_BIT
#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
#endif
static Window createDummyWindow(QXcbScreen *screen, XVisualInfo *visualInfo) static Window createDummyWindow(QXcbScreen *screen, XVisualInfo *visualInfo)
{ {
Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(screen), screen->root(), visualInfo->visual, AllocNone); Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(screen), screen->root(), visualInfo->visual, AllocNone);
@ -169,6 +173,8 @@ static void updateFormatFromContext(QSurfaceFormat &format)
format.setMinorVersion(minor); format.setMinorVersion(minor);
} }
format.setProfile(QSurfaceFormat::NoProfile);
const int version = (major << 8) + minor; const int version = (major << 8) + minor;
if (version < 0x0300) { if (version < 0x0300) {
format.setProfile(QSurfaceFormat::NoProfile); format.setProfile(QSurfaceFormat::NoProfile);
@ -180,9 +186,9 @@ static void updateFormatFromContext(QSurfaceFormat &format)
// a debug context // a debug context
GLint value = 0; GLint value = 0;
glGetIntegerv(GL_CONTEXT_FLAGS, &value); glGetIntegerv(GL_CONTEXT_FLAGS, &value);
if (value & ~GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) if (!(value & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT))
format.setOption(QSurfaceFormat::DeprecatedFunctions); format.setOption(QSurfaceFormat::DeprecatedFunctions);
if (value & GLX_CONTEXT_DEBUG_BIT_ARB) if (value & GL_CONTEXT_FLAG_DEBUG_BIT)
format.setOption(QSurfaceFormat::DebugContext); format.setOption(QSurfaceFormat::DebugContext);
if (version < 0x0302) if (version < 0x0302)
return; return;
@ -190,17 +196,11 @@ static void updateFormatFromContext(QSurfaceFormat &format)
// Version 3.2 and newer have a profile // Version 3.2 and newer have a profile
value = 0; value = 0;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &value); glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &value);
switch (value) {
case GLX_CONTEXT_CORE_PROFILE_BIT_ARB: if (value & GL_CONTEXT_CORE_PROFILE_BIT)
format.setProfile(QSurfaceFormat::CoreProfile); format.setProfile(QSurfaceFormat::CoreProfile);
break; else if (value & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
case GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB:
format.setProfile(QSurfaceFormat::CompatibilityProfile); format.setProfile(QSurfaceFormat::CompatibilityProfile);
break;
default:
format.setProfile(QSurfaceFormat::NoProfile);
break;
}
} }
/*! /*!
@ -287,6 +287,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB"); glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB");
QList<QByteArray> glxExt = QByteArray(glXQueryExtensionsString(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber())).split(' '); QList<QByteArray> glxExt = QByteArray(glXQueryExtensionsString(DISPLAY_FROM_XCB(m_screen), m_screen->screenNumber())).split(' ');
bool supportsProfiles = glxExt.contains("GLX_ARB_create_context_profile");
// Use glXCreateContextAttribsARB if is available // Use glXCreateContextAttribsARB if is available
if (glxExt.contains("GLX_ARB_create_context") && glXCreateContextAttribsARB != 0) { if (glxExt.contains("GLX_ARB_create_context") && glXCreateContextAttribsARB != 0) {
@ -306,7 +307,7 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
<< GLX_CONTEXT_MINOR_VERSION_ARB << minorVersion; << GLX_CONTEXT_MINOR_VERSION_ARB << minorVersion;
// If asking for OpenGL 3.2 or newer we should also specify a profile // If asking for OpenGL 3.2 or newer we should also specify a profile
if (m_format.majorVersion() > 3 || (m_format.majorVersion() == 3 && m_format.minorVersion() > 1)) { if (supportsProfiles && (m_format.majorVersion() > 3 || (m_format.majorVersion() == 3 && m_format.minorVersion() > 1))) {
if (m_format.profile() == QSurfaceFormat::CoreProfile) if (m_format.profile() == QSurfaceFormat::CoreProfile)
contextAttributes << GLX_CONTEXT_PROFILE_MASK_ARB << GLX_CONTEXT_CORE_PROFILE_BIT_ARB; contextAttributes << GLX_CONTEXT_PROFILE_MASK_ARB << GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
else else

View File

@ -1030,7 +1030,7 @@ QVariant QDB2Result::data(int field)
v = new QVariant(qGetIntData(d->hStmt, field, isNull)); v = new QVariant(qGetIntData(d->hStmt, field, isNull));
break; break;
case QSql::LowPrecisionInt64: case QSql::LowPrecisionInt64:
v = new QVariant(qGetBigIntData(d->hStmt, field, isNull)); v = new QVariant((qint64) qGetBigIntData(d->hStmt, field, isNull));
break; break;
case QSql::LowPrecisionDouble: case QSql::LowPrecisionDouble:
v = new QVariant(qGetDoubleData(d->hStmt, field, isNull)); v = new QVariant(qGetDoubleData(d->hStmt, field, isNull));

View File

@ -53,6 +53,7 @@
#include <qsocketnotifier.h> #include <qsocketnotifier.h>
#include <qstringlist.h> #include <qstringlist.h>
#include <qmutex.h> #include <qmutex.h>
#include <QtSql/private/qsqlresult_p.h>
#include <libpq-fe.h> #include <libpq-fe.h>
#include <pg_config.h> #include <pg_config.h>
@ -183,6 +184,7 @@ class QPSQLResultPrivate
{ {
public: public:
QPSQLResultPrivate(QPSQLResult *qq): q(qq), driver(0), result(0), currentSize(-1), preparedQueriesEnabled(false) {} QPSQLResultPrivate(QPSQLResult *qq): q(qq), driver(0), result(0), currentSize(-1), preparedQueriesEnabled(false) {}
static QString fieldSerial(int i) { return QLatin1Char('$') + QString::number(i + 1); }
QPSQLResult *q; QPSQLResult *q;
const QPSQLDriverPrivate *driver; const QPSQLDriverPrivate *driver;
@ -515,29 +517,6 @@ void QPSQLResult::virtual_hook(int id, void *data)
QSqlResult::virtual_hook(id, data); QSqlResult::virtual_hook(id, data);
} }
static QString qReplacePlaceholderMarkers(const QString &query)
{
const int originalLength = query.length();
bool inQuote = false;
int markerIdx = 0;
QString result;
result.reserve(originalLength + 23);
for (int i = 0; i < originalLength; ++i) {
const QChar ch = query.at(i);
if (ch == QLatin1Char('?') && !inQuote) {
result += QLatin1Char('$');
result += QString::number(++markerIdx);
} else {
if (ch == QLatin1Char('\''))
inQuote = !inQuote;
result += ch;
}
}
result.squeeze();
return result;
}
static QString qCreateParamString(const QVector<QVariant> boundValues, const QSqlDriver *driver) static QString qCreateParamString(const QVector<QVariant> boundValues, const QSqlDriver *driver)
{ {
if (boundValues.isEmpty()) if (boundValues.isEmpty())
@ -581,7 +560,7 @@ bool QPSQLResult::prepare(const QString &query)
qDeallocatePreparedStmt(d); qDeallocatePreparedStmt(d);
const QString stmtId = qMakePreparedStmtId(); const QString stmtId = qMakePreparedStmtId();
const QString stmt = QString::fromLatin1("PREPARE %1 AS ").arg(stmtId).append(qReplacePlaceholderMarkers(query)); const QString stmt = QString::fromLatin1("PREPARE %1 AS ").arg(stmtId).append(QSqlResultPrivate::positionalToNamedBinding(query, QPSQLResultPrivate::fieldSerial));
PGresult *result = d->driver->exec(stmt); PGresult *result = d->driver->exec(stmt);

View File

@ -55,15 +55,13 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
static QString qFieldSerial(int);
QString QSqlResultPrivate::holderAt(int index) const QString QSqlResultPrivate::holderAt(int index) const
{ {
return holders.size() > index ? holders.at(index).holderName : qFieldSerial(index); return holders.size() > index ? holders.at(index).holderName : fieldSerial(index);
} }
// return a unique id for bound names // return a unique id for bound names
static QString qFieldSerial(int i) QString QSqlResultPrivate::fieldSerial(int i)
{ {
ushort arr[] = { ':', 'f', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ushort arr[] = { ':', 'f', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ushort *ptr = &arr[1]; ushort *ptr = &arr[1];
@ -83,57 +81,90 @@ static bool qIsAlnum(QChar ch)
return u - 'a' < 26 || u - 'A' < 26 || u - '0' < 10 || u == '_'; return u - 'a' < 26 || u - 'A' < 26 || u - '0' < 10 || u == '_';
} }
QString QSqlResultPrivate::positionalToNamedBinding() QString QSqlResultPrivate::positionalToNamedBinding(const QString &query, QString (fieldSerialFunc)(int idx))
{ {
int n = sql.size(); int n = query.size();
QString result; QString result;
result.reserve(n * 5 / 4); result.reserve(n * 5 / 4);
bool inQuote = false; QChar closingQuote;
int count = 0; int count = 0;
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
QChar ch = sql.at(i); QChar ch = query.at(i);
if (ch == QLatin1Char('?') && !inQuote) { if (!closingQuote.isNull()) {
result += qFieldSerial(count++); if (ch == closingQuote) {
} else { if (closingQuote == QLatin1Char(']')
if (ch == QLatin1Char('\'')) && i + 1 < n && query.at(i + 1) == closingQuote) {
inQuote = !inQuote; // consume the extra character. don't close.
++i;
result += ch;
} else {
closingQuote = QChar();
}
}
result += ch; result += ch;
} else {
if (ch == QLatin1Char('?')) {
result += fieldSerialFunc(count++);
} else {
if (ch == QLatin1Char('\'') || ch == QLatin1Char('"') || ch == QLatin1Char('`'))
closingQuote = ch;
else if (ch == QLatin1Char('['))
closingQuote = QLatin1Char(']');
result += ch;
}
} }
} }
result.squeeze(); result.squeeze();
return result; return result;
} }
QString QSqlResultPrivate::namedToPositionalBinding() QString QSqlResultPrivate::namedToPositionalBinding(const QString &query)
{ {
int n = sql.size(); int n = query.size();
QString result; QString result;
result.reserve(n); result.reserve(n);
bool inQuote = false; QChar closingQuote;
int count = 0; int count = 0;
int i = 0; int i = 0;
while (i < n) { while (i < n) {
QChar ch = sql.at(i); QChar ch = query.at(i);
if (ch == QLatin1Char(':') && !inQuote if (!closingQuote.isNull()) {
&& (i == 0 || sql.at(i - 1) != QLatin1Char(':')) if (ch == closingQuote) {
&& (i + 1 < n && qIsAlnum(sql.at(i + 1)))) { if (closingQuote == QLatin1Char(']')
int pos = i + 2; && i + 1 < n && query.at(i + 1) == closingQuote) {
while (pos < n && qIsAlnum(sql.at(pos))) // consume the extra character. don't close.
++pos; ++i;
QString holder(sql.mid(i, pos - i)); result += ch;
indexes[holder].append(count++); } else {
holders.append(QHolder(holder, i)); closingQuote = QChar();
result += QLatin1Char('?'); }
i = pos; }
} else {
if (ch == QLatin1Char('\''))
inQuote = !inQuote;
result += ch; result += ch;
++i; ++i;
} else {
if (ch == QLatin1Char(':')
&& (i == 0 || query.at(i - 1) != QLatin1Char(':'))
&& (i + 1 < n && qIsAlnum(query.at(i + 1)))) {
int pos = i + 2;
while (pos < n && qIsAlnum(query.at(pos)))
++pos;
QString holder(query.mid(i, pos - i));
indexes[holder].append(count++);
holders.append(QHolder(holder, i));
result += QLatin1Char('?');
i = pos;
} else {
if (ch == QLatin1Char('\'') || ch == QLatin1Char('"') || ch == QLatin1Char('`'))
closingQuote = ch;
else if (ch == QLatin1Char('['))
closingQuote = QLatin1Char(']');
result += ch;
++i;
}
} }
} }
result.squeeze(); result.squeeze();
@ -531,10 +562,10 @@ bool QSqlResult::savePrepare(const QString& query)
return prepare(query); return prepare(query);
// parse the query to memorize parameter location // parse the query to memorize parameter location
d->executedQuery = d->namedToPositionalBinding(); d->executedQuery = d->namedToPositionalBinding(query);
if (driver()->hasFeature(QSqlDriver::NamedPlaceholders)) if (driver()->hasFeature(QSqlDriver::NamedPlaceholders))
d->executedQuery = d->positionalToNamedBinding(); d->executedQuery = QSqlResultPrivate::positionalToNamedBinding(query);
return prepare(d->executedQuery); return prepare(d->executedQuery);
} }
@ -551,7 +582,7 @@ bool QSqlResult::prepare(const QString& query)
d->sql = query; d->sql = query;
if (d->holders.isEmpty()) { if (d->holders.isEmpty()) {
// parse the query to memorize parameter location // parse the query to memorize parameter location
d->namedToPositionalBinding(); d->namedToPositionalBinding(query);
} }
return true; // fake prepares should always succeed return true; // fake prepares should always succeed
} }
@ -617,7 +648,7 @@ bool QSqlResult::exec()
void QSqlResult::bindValue(int index, const QVariant& val, QSql::ParamType paramType) void QSqlResult::bindValue(int index, const QVariant& val, QSql::ParamType paramType)
{ {
d->binds = PositionalBinding; d->binds = PositionalBinding;
d->indexes[qFieldSerial(index)].append(index); d->indexes[QSqlResultPrivate::fieldSerial(index)].append(index);
if (d->values.count() <= index) if (d->values.count() <= index)
d->values.resize(index + 1); d->values.resize(index + 1);
d->values[index] = val; d->values[index] = val;

View File

@ -106,8 +106,14 @@ public:
clearIndex();; clearIndex();;
} }
QString positionalToNamedBinding(); // positionalToNamedBinding uses fieldSerial() by default, which converts to Oracle-style names,
QString namedToPositionalBinding(); // because this style is used in the API. A driver can reuse positionalToNamedBinding()
// internally for its own naming style by supplying its own fieldSerialFunc. We cannot make
// fieldSerial() virtual because it would allow a driver to impose its naming style on
// executedQuery when set by QSqlResult::savePrepare().
static QString fieldSerial(int);
static QString positionalToNamedBinding(const QString &query, QString (fieldSerialFunc)(int idx) = fieldSerial);
QString namedToPositionalBinding(const QString &query);
QString holderAt(int index) const; QString holderAt(int index) const;
QSqlResult *q; QSqlResult *q;

View File

@ -188,6 +188,7 @@ private:
#define CONFIG_INDEXES "indexes" #define CONFIG_INDEXES "indexes"
#define CONFIG_LANGUAGE "language" #define CONFIG_LANGUAGE "language"
#define CONFIG_MACRO "macro" #define CONFIG_MACRO "macro"
#define CONFIG_MANIFESTMETA "manifestmeta"
#define CONFIG_NATURALLANGUAGE "naturallanguage" #define CONFIG_NATURALLANGUAGE "naturallanguage"
#define CONFIG_NOLINKERRORS "nolinkerrors" #define CONFIG_NOLINKERRORS "nolinkerrors"
#define CONFIG_OBSOLETELINKS "obsoletelinks" #define CONFIG_OBSOLETELINKS "obsoletelinks"

View File

@ -1165,8 +1165,8 @@ QList<Section> CppCodeMarker::qmlSections(const QmlClassNode* qmlClassNode, Syno
} }
++c; ++c;
} }
if (qcn->qmlBase() != 0) { if (qcn->qmlBaseNode() != 0) {
qcn = static_cast<const QmlClassNode*>(qcn->qmlBase()); qcn = static_cast<const QmlClassNode*>(qcn->qmlBaseNode());
if (!qcn->isAbstract()) if (!qcn->isAbstract())
qcn = 0; qcn = 0;
} }
@ -1241,8 +1241,8 @@ QList<Section> CppCodeMarker::qmlSections(const QmlClassNode* qmlClassNode, Syno
} }
++c; ++c;
} }
if (qcn->qmlBase() != 0) { if (qcn->qmlBaseNode() != 0) {
qcn = static_cast<const QmlClassNode*>(qcn->qmlBase()); qcn = static_cast<const QmlClassNode*>(qcn->qmlBaseNode());
if (!qcn->isAbstract()) if (!qcn->isAbstract())
qcn = 0; qcn = 0;
} }
@ -1287,7 +1287,7 @@ QList<Section> CppCodeMarker::qmlSections(const QmlClassNode* qmlClassNode, Syno
} }
++c; ++c;
} }
const DocNode* dn = current->qmlBase(); const DocNode* dn = current->qmlBaseNode();
if (dn) { if (dn) {
if (dn->subType() == Node::QmlClass) if (dn->subType() == Node::QmlClass)
current = static_cast<const QmlClassNode*>(dn); current = static_cast<const QmlClassNode*>(dn);

View File

@ -951,11 +951,10 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc,
else if (command == COMMAND_QMLINHERITS) { else if (command == COMMAND_QMLINHERITS) {
if (node->name() == arg) if (node->name() == arg)
doc.location().warning(tr("%1 tries to inherit itself").arg(arg)); doc.location().warning(tr("%1 tries to inherit itself").arg(arg));
else { else if (node->subType() == Node::QmlClass) {
setLink(node, Node::InheritsLink, arg); QmlClassNode *qmlClass = static_cast<QmlClassNode*>(node);
if (node->subType() == Node::QmlClass) { qmlClass->setQmlBaseName(arg);
QmlClassNode::addInheritedBy(arg,node); QmlClassNode::addInheritedBy(arg,node);
}
} }
} }
else if (command == COMMAND_QMLINSTANTIATES) { else if (command == COMMAND_QMLINSTANTIATES) {

View File

@ -4198,7 +4198,7 @@ void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* qcn, CodeMarker*
{ {
if (!qcn) if (!qcn)
return; return;
const DocNode* base = qcn->qmlBase(); const DocNode* base = qcn->qmlBaseNode();
if (base) { if (base) {
writeStartTag(DT_qmlInherits); writeStartTag(DT_qmlInherits);
//writeStartTag(DT_qmlTypeDef); //writeStartTag(DT_qmlTypeDef);

View File

@ -223,6 +223,7 @@ void HtmlGenerator::initializeGenerator(const Config &config)
QString prefix = CONFIG_QHP + Config::dot + project + Config::dot; QString prefix = CONFIG_QHP + Config::dot + project + Config::dot;
manifestDir = "qthelp://" + config.getString(prefix + "namespace"); manifestDir = "qthelp://" + config.getString(prefix + "namespace");
manifestDir += QLatin1Char('/') + config.getString(prefix + "virtualFolder") + QLatin1Char('/'); manifestDir += QLatin1Char('/') + config.getString(prefix + "virtualFolder") + QLatin1Char('/');
readManifestMetaContent(config);
examplesPath = config.getString(CONFIG_EXAMPLESINSTALLPATH); examplesPath = config.getString(CONFIG_EXAMPLESINSTALLPATH);
if (!examplesPath.isEmpty()) if (!examplesPath.isEmpty())
examplesPath += QLatin1Char('/'); examplesPath += QLatin1Char('/');
@ -3869,7 +3870,7 @@ void HtmlGenerator::generateQmlInherits(const QmlClassNode* qcn, CodeMarker* mar
{ {
if (!qcn) if (!qcn)
return; return;
const DocNode* base = qcn->qmlBase(); const DocNode* base = qcn->qmlBaseNode();
if (base) { if (base) {
Text text; Text text;
text << Atom::ParaLeft << "Inherits "; text << Atom::ParaLeft << "Inherits ";
@ -3991,10 +3992,11 @@ void HtmlGenerator::generateManifestFiles()
generateManifestFile("examples", "example"); generateManifestFile("examples", "example");
generateManifestFile("demos", "demo"); generateManifestFile("demos", "demo");
ExampleNode::exampleNodeMap.clear(); ExampleNode::exampleNodeMap.clear();
manifestMetaContent.clear();
} }
/*! /*!
This function is called by generaqteManiferstFile(), once This function is called by generateManifestFiles(), once
for each manifest file to be generated. \a manifest is the for each manifest file to be generated. \a manifest is the
type of manifest file. type of manifest file.
*/ */
@ -4086,6 +4088,36 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
} }
if (!en->imageFileName().isEmpty()) if (!en->imageFileName().isEmpty())
writer.writeAttribute("imageUrl", manifestDir + en->imageFileName()); writer.writeAttribute("imageUrl", manifestDir + en->imageFileName());
QString fullName = project + QLatin1Char('/') + en->title();
QSet<QString> tags;
for (int idx=0; idx < manifestMetaContent.size(); ++idx) {
foreach (const QString &name, manifestMetaContent[idx].names) {
bool match = false;
int wildcard = name.indexOf(QChar('*'));
switch (wildcard) {
case -1: // no wildcard, exact match
match = (fullName == name);
break;
case 0: // '*' matches all
match = true;
break;
default: // match with wildcard at the end
match = fullName.startsWith(name.left(wildcard));
}
if (match) {
tags += manifestMetaContent[idx].tags;
foreach (const QString &attr, manifestMetaContent[idx].attributes) {
QStringList attrList = attr.split(QLatin1Char(':'), QString::SkipEmptyParts);
if (attrList.count() == 1)
attrList.append(QStringLiteral("true"));
if (attrList.count() == 2)
writer.writeAttribute(attrList[0], attrList[1]);
}
}
}
}
writer.writeStartElement("description"); writer.writeStartElement("description");
Text brief = en->doc().briefText(); Text brief = en->doc().briefText();
if (!brief.isEmpty()) if (!brief.isEmpty())
@ -4093,12 +4125,11 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
else else
writer.writeCDATA(QString("No description available")); writer.writeCDATA(QString("No description available"));
writer.writeEndElement(); // description writer.writeEndElement(); // description
QStringList tags = en->title().toLower().split(QLatin1Char(' ')); tags += QSet<QString>::fromList(en->title().toLower().split(QLatin1Char(' ')));
if (!tags.isEmpty()) { if (!tags.isEmpty()) {
writer.writeStartElement("tags"); writer.writeStartElement("tags");
bool wrote_one = false; bool wrote_one = false;
for (int n=0; n<tags.size(); ++n) { foreach (QString tag, tags) {
QString tag = tags.at(n);
if (tag.at(0).isDigit()) if (tag.at(0).isDigit())
continue; continue;
if (tag.at(0) == '-') if (tag.at(0) == '-')
@ -4109,7 +4140,7 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
continue; continue;
if (tag.endsWith(QLatin1Char(':'))) if (tag.endsWith(QLatin1Char(':')))
tag.chop(1); tag.chop(1);
if (n>0 && wrote_one) if (wrote_one)
writer.writeCharacters(","); writer.writeCharacters(",");
writer.writeCharacters(tag); writer.writeCharacters(tag);
wrote_one = true; wrote_one = true;
@ -4162,6 +4193,25 @@ void HtmlGenerator::generateManifestFile(QString manifest, QString element)
file.close(); file.close();
} }
/*!
Reads metacontent - additional attributes and tags to apply
when generating manifest files, read from config. Takes the
configuration class \a config as a parameter.
*/
void HtmlGenerator::readManifestMetaContent(const Config &config)
{
QStringList names = config.getStringList(CONFIG_MANIFESTMETA + Config::dot + QStringLiteral("filters"));
foreach (const QString &manifest, names) {
ManifestMetaFilter filter;
QString prefix = CONFIG_MANIFESTMETA + Config::dot + manifest + Config::dot;
filter.names = config.getStringSet(prefix + QStringLiteral("names"));
filter.attributes = config.getStringSet(prefix + QStringLiteral("attributes"));
filter.tags = config.getStringSet(prefix + QStringLiteral("tags"));
manifestMetaContent.append(filter);
}
}
/*! /*!
Find global entities that have documentation but no Find global entities that have documentation but no
\e{relates} comand. Report these as errors if they \e{relates} comand. Report these as errors if they

View File

@ -108,6 +108,7 @@ protected:
virtual QString linkForNode(const Node *node, const Node *relative); virtual QString linkForNode(const Node *node, const Node *relative);
void generateManifestFile(QString manifest, QString element); void generateManifestFile(QString manifest, QString element);
void readManifestMetaContent(const Config &config);
private: private:
enum SubTitleSize { SmallSubTitle, LargeSubTitle }; enum SubTitleSize { SmallSubTitle, LargeSubTitle };
@ -118,6 +119,13 @@ private:
EndMark EndMark
}; };
struct ManifestMetaFilter
{
QSet<QString> names;
QSet<QString> attributes;
QSet<QString> tags;
};
const QPair<QString,QString> anchorForNode(const Node *node); const QPair<QString,QString> anchorForNode(const Node *node);
void generateBreadCrumbs(const QString& title, void generateBreadCrumbs(const QString& title,
const Node *node, const Node *node,
@ -242,6 +250,7 @@ private:
bool obsoleteLinks; bool obsoleteLinks;
QStack<QXmlStreamWriter*> xmlWriterStack; QStack<QXmlStreamWriter*> xmlWriterStack;
static int id; static int id;
QList<ManifestMetaFilter> manifestMetaContent;
public: public:
static bool debugging_on; static bool debugging_on;
static QString divNavTop; static QString divNavTop;

View File

@ -2097,7 +2097,7 @@ QmlClassNode::QmlClassNode(InnerNode *parent, const QString& name)
abstract_(false), abstract_(false),
cnodeRequired_(false), cnodeRequired_(false),
cnode_(0), cnode_(0),
base_(0) baseNode_(0)
{ {
int i = 0; int i = 0;
if (name.startsWith("QML:")) { if (name.startsWith("QML:")) {

View File

@ -131,8 +131,7 @@ public:
NextLink, NextLink,
PreviousLink, PreviousLink,
ContentsLink, ContentsLink,
IndexLink, IndexLink /*,
InheritsLink /*,
GlossaryLink, GlossaryLink,
CopyrightLink, CopyrightLink,
ChapterLink, ChapterLink,
@ -546,8 +545,10 @@ public:
virtual void setAbstract(bool b) { abstract_ = b; } virtual void setAbstract(bool b) { abstract_ = b; }
const ImportList& importList() const { return importList_; } const ImportList& importList() const { return importList_; }
void setImportList(const ImportList& il) { importList_ = il; } void setImportList(const ImportList& il) { importList_ = il; }
const DocNode* qmlBase() const { return base_; } const QString& qmlBaseName() const { return baseName_; }
void setQmlBase(DocNode* b) { base_ = b; } void setQmlBaseName(const QString& name) { baseName_ = name; }
const DocNode* qmlBaseNode() const { return baseNode_; }
void setQmlBaseNode(DocNode* b) { baseNode_ = b; }
void requireCppClass() { cnodeRequired_ = true; } void requireCppClass() { cnodeRequired_ = true; }
bool cppClassRequired() const { return cnodeRequired_; } bool cppClassRequired() const { return cnodeRequired_; }
static void addInheritedBy(const QString& base, Node* sub); static void addInheritedBy(const QString& base, Node* sub);
@ -562,7 +563,8 @@ private:
bool abstract_; bool abstract_;
bool cnodeRequired_; bool cnodeRequired_;
ClassNode* cnode_; ClassNode* cnode_;
DocNode* base_; QString baseName_;
DocNode* baseNode_;
ImportList importList_; ImportList importList_;
}; };

View File

@ -91,3 +91,5 @@ qtPrepareTool(QHELPGENERATOR, qhelpgenerator)
QMAKE_DOCS = $$PWD/doc/config/qdoc.qdocconf QMAKE_DOCS = $$PWD/doc/config/qdoc.qdocconf
load(qt_tool) load(qt_tool)
TR_EXCLUDE += $$PWD/*

View File

@ -623,6 +623,7 @@ const NodeMultiMap& QDocDatabase::getSinceMap(const QString& key) const
to generating documentation. to generating documentation.
*/ */
void QDocDatabase::resolveIssues() { void QDocDatabase::resolveIssues() {
resolveQmlInheritance(treeRoot());
resolveTargets(treeRoot()); resolveTargets(treeRoot());
tree_->resolveCppToQmlLinks(); tree_->resolveCppToQmlLinks();
} }
@ -821,6 +822,35 @@ QString QDocDatabase::findTarget(const QString& target, const Node* node) const
return QString(); return QString();
} }
/*!
For each QML Type node in the tree beginning at \a root,
if it has a QML base type name but its QML base type node
pointer is 0, use the QML base type name to look up the
base type node. If the node is found in the tree, set the
node's QML base type node pointer.
*/
void QDocDatabase::resolveQmlInheritance(InnerNode* root)
{
// Dop we need recursion?
foreach (Node* child, root->childNodes()) {
if (child->type() == Node::Document && child->subType() == Node::QmlClass) {
QmlClassNode* qcn = static_cast<QmlClassNode*>(child);
if ((qcn->qmlBaseNode() == 0) && !qcn->qmlBaseName().isEmpty()) {
QmlClassNode* bqcn = findQmlType(QString(), qcn->qmlBaseName());
if (bqcn) {
qcn->setQmlBaseNode(bqcn);
}
#if 0
else {
qDebug() << "Unable to resolve QML base type:" << qcn->qmlBaseName()
<< "for QML type:" << qcn->name();
}
#endif
}
}
}
}
/*! /*!
*/ */
void QDocDatabase::resolveTargets(InnerNode* root) void QDocDatabase::resolveTargets(InnerNode* root)

View File

@ -140,6 +140,7 @@ class QDocDatabase
Tree* tree() { return tree_; } Tree* tree() { return tree_; }
NamespaceNode* treeRoot() { return tree_->root(); } NamespaceNode* treeRoot() { return tree_->root(); }
void resolveInheritance() { tree_->resolveInheritance(); } void resolveInheritance() { tree_->resolveInheritance(); }
void resolveQmlInheritance(InnerNode* root);
void resolveIssues(); void resolveIssues();
void fixInheritance() { tree_->fixInheritance(); } void fixInheritance() { tree_->fixInheritance(); }
void resolveProperties() { tree_->resolveProperties(); } void resolveProperties() { tree_->resolveProperties(); }

View File

@ -106,7 +106,7 @@ QmlDocVisitor::~QmlDocVisitor()
} }
/*! /*!
Returns the location of thre nearest comment above the \a offset. Returns the location of the nearest comment above the \a offset.
*/ */
QQmlJS::AST::SourceLocation QmlDocVisitor::precedingComment(quint32 offset) const QQmlJS::AST::SourceLocation QmlDocVisitor::precedingComment(quint32 offset) const
{ {
@ -322,11 +322,10 @@ void QmlDocVisitor::applyMetacommands(QQmlJS::AST::SourceLocation,
else if (command == COMMAND_QMLINHERITS) { else if (command == COMMAND_QMLINHERITS) {
if (node->name() == args[0].first) if (node->name() == args[0].first)
doc.location().warning(tr("%1 tries to inherit itself").arg(args[0].first)); doc.location().warning(tr("%1 tries to inherit itself").arg(args[0].first));
else { else if (node->subType() == Node::QmlClass) {
CodeParser::setLink(node, Node::InheritsLink, args[0].first); QmlClassNode *qmlClass = static_cast<QmlClassNode*>(node);
if (node->subType() == Node::QmlClass) { qmlClass->setQmlBaseName(args[0].first);
QmlClassNode::addInheritedBy(args[0].first,node); QmlClassNode::addInheritedBy(args[0].first,node);
}
} }
} }
else if (command == COMMAND_QMLDEFAULT) { else if (command == COMMAND_QMLDEFAULT) {
@ -389,11 +388,9 @@ bool QmlDocVisitor::visit(QQmlJS::AST::UiObjectDefinition *definition)
QmlClassNode *component = new QmlClassNode(current, name); QmlClassNode *component = new QmlClassNode(current, name);
component->setTitle(name); component->setTitle(name);
component->setImportList(importList); component->setImportList(importList);
if (applyDocumentation(definition->firstSourceLocation(), component)) { if (applyDocumentation(definition->firstSourceLocation(), component)) {
QmlClassNode::addInheritedBy(type, component); QmlClassNode::addInheritedBy(type, component);
if (!component->links().contains(Node::InheritsLink)) component->setQmlBaseName(type);
component->setLink(Node::InheritsLink, type, type);
} }
current = component; current = component;
} }

View File

@ -399,10 +399,12 @@ void Tree::addPropertyFunction(PropertyNode* property,
/*! /*!
This function resolves inheritance and reimplementation settings This function resolves inheritance and reimplementation settings
for each class node found in the namspace beginning ar \a rootNode. for each C++ class node found in the namspace beginning at \a rootNode.
If it finds another namespace node in the child list of \a rootNode, If it finds another namespace node in the child list of \a rootNode,
it calls itself recursively. For each child of \a rootNode that is a it calls itself recursively. For each child of \a rootNode that is a
class node, it calls the other resolveInheritance() function. class node, it calls the other resolveInheritance() function.
This function does not resolve QML inheritance.
*/ */
void Tree::resolveInheritance(NamespaceNode* rootNode) void Tree::resolveInheritance(NamespaceNode* rootNode)
{ {

View File

@ -41,5 +41,3 @@ SUBDIRS = $$TOOLS_SUBDIRS
bootstrap_prepare_docs.depends += $${src_tools_qdoc.target}-make_first bootstrap_prepare_docs.depends += $${src_tools_qdoc.target}-make_first
bootstrap_prepare_docs.target = $${src_tools_bootstrap.target}-prepare_docs bootstrap_prepare_docs.target = $${src_tools_bootstrap.target}-prepare_docs
QMAKE_EXTRA_TARGETS += bootstrap_prepare_docs QMAKE_EXTRA_TARGETS += bootstrap_prepare_docs
TR_EXCLUDE += $$PWD/*

View File

@ -536,6 +536,7 @@ void QFileDialogPrivate::initHelper(QPlatformDialogHelper *h)
QObject::connect(h, SIGNAL(filesSelected(QStringList)), d, SIGNAL(filesSelected(QStringList))); QObject::connect(h, SIGNAL(filesSelected(QStringList)), d, SIGNAL(filesSelected(QStringList)));
QObject::connect(h, SIGNAL(currentChanged(QString)), d, SIGNAL(currentChanged(QString))); QObject::connect(h, SIGNAL(currentChanged(QString)), d, SIGNAL(currentChanged(QString)));
QObject::connect(h, SIGNAL(directoryEntered(QString)), d, SIGNAL(directoryEntered(QString))); QObject::connect(h, SIGNAL(directoryEntered(QString)), d, SIGNAL(directoryEntered(QString)));
QObject::connect(h, SIGNAL(directoryEntered(QString)), d, SLOT(_q_nativeEnterDirectory(QString)));
QObject::connect(h, SIGNAL(filterSelected(QString)), d, SIGNAL(filterSelected(QString))); QObject::connect(h, SIGNAL(filterSelected(QString)), d, SIGNAL(filterSelected(QString)));
static_cast<QPlatformFileDialogHelper *>(h)->setOptions(options); static_cast<QPlatformFileDialogHelper *>(h)->setOptions(options);
} }
@ -3114,6 +3115,12 @@ void QFileDialogPrivate::_q_fileRenamed(const QString &path, const QString oldNa
} }
} }
void QFileDialogPrivate::_q_nativeEnterDirectory(const QString &directory)
{
if (!directory.isEmpty()) // Windows native dialogs occasionally emit signals with empty strings.
*lastVisitedDir() = directory;
}
/*! /*!
\internal \internal

View File

@ -240,6 +240,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_updateOkButton()) Q_PRIVATE_SLOT(d_func(), void _q_updateOkButton())
Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(const QModelIndex &index)) Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(const QModelIndex &index))
Q_PRIVATE_SLOT(d_func(), void _q_enterDirectory(const QModelIndex &index)) Q_PRIVATE_SLOT(d_func(), void _q_enterDirectory(const QModelIndex &index))
Q_PRIVATE_SLOT(d_func(), void _q_nativeEnterDirectory(const QString&))
Q_PRIVATE_SLOT(d_func(), void _q_goToDirectory(const QString &path)) Q_PRIVATE_SLOT(d_func(), void _q_goToDirectory(const QString &path))
Q_PRIVATE_SLOT(d_func(), void _q_useNameFilter(int index)) Q_PRIVATE_SLOT(d_func(), void _q_useNameFilter(int index))
Q_PRIVATE_SLOT(d_func(), void _q_selectionChanged()) Q_PRIVATE_SLOT(d_func(), void _q_selectionChanged())

View File

@ -204,6 +204,7 @@ public:
void _q_updateOkButton(); void _q_updateOkButton();
void _q_currentChanged(const QModelIndex &index); void _q_currentChanged(const QModelIndex &index);
void _q_enterDirectory(const QModelIndex &index); void _q_enterDirectory(const QModelIndex &index);
void _q_nativeEnterDirectory(const QString &directory);
void _q_goToDirectory(const QString &); void _q_goToDirectory(const QString &);
void _q_useNameFilter(int index); void _q_useNameFilter(int index);
void _q_selectionChanged(); void _q_selectionChanged();

View File

@ -34,6 +34,15 @@ headerdirs += ..
sourcedirs += .. \ sourcedirs += .. \
../../../examples/widgets/doc/src ../../../examples/widgets/doc/src
excludefiles += ../widgets/qmacnativewidget_mac.h \
../widgets/qmaccocoaviewcontainer_mac.h \
../widgets/qcocoatoolbardelegate_mac_p.h \
../widgets/qcocoamenu_mac_p.h \
../widgets/qmaccocoaviewcontainer_mac.mm \
../widgets/qcocoatoolbardelegate_mac.mm \
../widgets/qmainwindowlayout_mac.mm \
../widgets/qmacnativewidget_mac.mm
exampledirs += ../../../examples/widgets \ exampledirs += ../../../examples/widgets \
../../../doc/src/snippets \ ../../../doc/src/snippets \
../ \ ../ \

View File

@ -2178,6 +2178,8 @@ bool QGraphicsItem::hasCursor() const
*/ */
void QGraphicsItem::unsetCursor() void QGraphicsItem::unsetCursor()
{ {
if (!d_ptr->hasCursor)
return;
d_ptr->unsetExtra(QGraphicsItemPrivate::ExtraCursor); d_ptr->unsetExtra(QGraphicsItemPrivate::ExtraCursor);
d_ptr->hasCursor = 0; d_ptr->hasCursor = 0;
if (d_ptr->scene) { if (d_ptr->scene) {

View File

@ -1391,6 +1391,14 @@ QWidget::~QWidget()
QT_TRY { QT_TRY {
#ifndef QT_NO_GRAPHICSVIEW
const QWidget* w = this;
while (w->d_func()->extra && w->d_func()->extra->focus_proxy)
w = w->d_func()->extra->focus_proxy;
QWidget *window = w->window();
QWExtra *e = window ? window->d_func()->extra : 0;
if (!e || !e->proxyWidget)
#endif
clearFocus(); clearFocus();
} QT_CATCH(...) { } QT_CATCH(...) {
// swallow this problem because we are in a destructor // swallow this problem because we are in a destructor
@ -8414,7 +8422,7 @@ void QWidget::mouseReleaseEvent(QMouseEvent *event)
void QWidget::mouseDoubleClickEvent(QMouseEvent *event) void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
{ {
Q_UNUSED(event); event->ignore();
} }
#ifndef QT_NO_WHEELEVENT #ifndef QT_NO_WHEELEVENT

View File

@ -2705,7 +2705,8 @@ int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w
ret = false; ret = false;
break; break;
case SH_ScrollBar_Transient: case SH_ScrollBar_Transient:
if (qobject_cast<const QScrollBar *>(w) || if ((qobject_cast<const QScrollBar *>(w) && w->parent() &&
qobject_cast<QAbstractScrollArea*>(w->parent()->parent())) ||
(opt && QStyleHelper::hasAncestor(opt->styleObject, QAccessible::ScrollBar))) { (opt && QStyleHelper::hasAncestor(opt->styleObject, QAccessible::ScrollBar))) {
ret = QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7; ret = QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7

View File

@ -86,17 +86,13 @@ qreal dpiScaled(qreal value)
#endif #endif
} }
#ifndef QT_NO_ACCESSIBILITY
bool isInstanceOf(QObject *obj, QAccessible::Role role) bool isInstanceOf(QObject *obj, QAccessible::Role role)
{ {
bool match = false; bool match = false;
#ifndef QT_NO_ACCESSIBILITY
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(obj); QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(obj);
match = iface && iface->role() == role; match = iface && iface->role() == role;
delete iface; delete iface;
#else
Q_UNUSED(obj)
Q_UNUSED(role)
#endif // QT_NO_ACCESSIBILITY
return match; return match;
} }
@ -104,19 +100,15 @@ bool isInstanceOf(QObject *obj, QAccessible::Role role)
bool hasAncestor(QObject *obj, QAccessible::Role role) bool hasAncestor(QObject *obj, QAccessible::Role role)
{ {
bool found = false; bool found = false;
#ifndef QT_NO_ACCESSIBILITY
QObject *parent = obj ? obj->parent() : 0; QObject *parent = obj ? obj->parent() : 0;
while (parent && !found) { while (parent && !found) {
if (isInstanceOf(parent, role)) if (isInstanceOf(parent, role))
found = true; found = true;
parent = parent->parent(); parent = parent->parent();
} }
#else
Q_UNUSED(obj)
Q_UNUSED(role)
#endif // QT_NO_ACCESSIBILITY
return found; return found;
} }
#endif // QT_NO_ACCESSIBILITY
#ifndef QT_NO_DIAL #ifndef QT_NO_DIAL

View File

@ -82,8 +82,10 @@ namespace QStyleHelper
void drawBorderPixmap(const QPixmap &pixmap, QPainter *painter, const QRect &rect, void drawBorderPixmap(const QPixmap &pixmap, QPainter *painter, const QRect &rect,
int left = 0, int top = 0, int right = 0, int left = 0, int top = 0, int right = 0,
int bottom = 0); int bottom = 0);
#ifndef QT_NO_ACCESSIBILITY
bool isInstanceOf(QObject *obj, QAccessible::Role role); bool isInstanceOf(QObject *obj, QAccessible::Role role);
bool hasAncestor(QObject *obj, QAccessible::Role role); bool hasAncestor(QObject *obj, QAccessible::Role role);
#endif
} }

View File

@ -68,7 +68,7 @@ void QSystemTrayIconPrivate::install_sys()
if (qpa_sys) { if (qpa_sys) {
qpa_sys->init(); qpa_sys->init();
QObject::connect(qpa_sys, SIGNAL(activated(QPlatformSystemTrayIcon::ActivationReason)), QObject::connect(qpa_sys, SIGNAL(activated(QPlatformSystemTrayIcon::ActivationReason)),
q_func(), SLOT(emitActivated(QPlatformSystemTrayIcon::ActivationReason))); q_func(), SLOT(_q_emitActivated(QPlatformSystemTrayIcon::ActivationReason)));
QObject::connect(qpa_sys, SIGNAL(messageClicked()), QObject::connect(qpa_sys, SIGNAL(messageClicked()),
q_func(), SIGNAL(messageClicked())); q_func(), SIGNAL(messageClicked()));
updateMenu_sys(); updateMenu_sys();

View File

@ -2412,11 +2412,6 @@ QObjectCleanupHandler (0x7f4f93c4fa90) 0
QObject (0x7f4f93e37f60) 0 QObject (0x7f4f93e37f60) 0
primary-for QObjectCleanupHandler (0x7f4f93c4fa90) primary-for QObjectCleanupHandler (0x7f4f93c4fa90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f4f93c62060) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb45852d0) 0
QObject (0xb4452038) 0 QObject (0xb4452038) 0
primary-for QObjectCleanupHandler (0xb45852d0) primary-for QObjectCleanupHandler (0xb45852d0)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb4452578) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7f392077aa90) 0
QObject (0x7f3920962f60) 0 QObject (0x7f3920962f60) 0
primary-for QObjectCleanupHandler (0x7f392077aa90) primary-for QObjectCleanupHandler (0x7f392077aa90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f392078d060) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb45942d0) 0
QObject (0xb4461038) 0 QObject (0xb4461038) 0
primary-for QObjectCleanupHandler (0xb45942d0) primary-for QObjectCleanupHandler (0xb45942d0)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb4461578) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7fbaa1e96a90) 0
QObject (0x7fbaa1ea7000) 0 QObject (0x7fbaa1ea7000) 0
primary-for QObjectCleanupHandler (0x7fbaa1e96a90) primary-for QObjectCleanupHandler (0x7fbaa1e96a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7fbaa1ea70c0) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb452e2d0) 0
QObject (0xb43fc038) 0 QObject (0xb43fc038) 0
primary-for QObjectCleanupHandler (0xb452e2d0) primary-for QObjectCleanupHandler (0xb452e2d0)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb43fc578) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7f7180f27a90) 0
QObject (0x7f7180e6d480) 0 QObject (0x7f7180e6d480) 0
primary-for QObjectCleanupHandler (0x7f7180f27a90) primary-for QObjectCleanupHandler (0x7f7180f27a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f7180e6d540) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb42044ec) 0
QObject (0xb41bb348) 0 QObject (0xb41bb348) 0
primary-for QObjectCleanupHandler (0xb42044ec) primary-for QObjectCleanupHandler (0xb42044ec)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb41bb888) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7fb654a90a90) 0
QObject (0x7fb654c78f60) 0 QObject (0x7fb654c78f60) 0
primary-for QObjectCleanupHandler (0x7fb654a90a90) primary-for QObjectCleanupHandler (0x7fb654a90a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7fb654aa3060) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb434b2d0) 0
QObject (0xb4418070) 0 QObject (0xb4418070) 0
primary-for QObjectCleanupHandler (0xb434b2d0) primary-for QObjectCleanupHandler (0xb434b2d0)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb44185b0) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7f04b9c1da90) 0
QObject (0x7f04b9b0e900) 0 QObject (0x7f04b9b0e900) 0
primary-for QObjectCleanupHandler (0x7f04b9c1da90) primary-for QObjectCleanupHandler (0x7f04b9c1da90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f04b9b0e9c0) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb4463c30) 0
QObject (0xb4070508) 0 QObject (0xb4070508) 0
primary-for QObjectCleanupHandler (0xb4463c30) primary-for QObjectCleanupHandler (0xb4463c30)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb4070a48) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2412,11 +2412,6 @@ QObjectCleanupHandler (0x7f0bd6b6ba90) 0
QObject (0x7f0bd6aac4e0) 0 QObject (0x7f0bd6aac4e0) 0
primary-for QObjectCleanupHandler (0x7f0bd6b6ba90) primary-for QObjectCleanupHandler (0x7f0bd6b6ba90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f0bd6aac5a0) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb426f5dc) 0
QObject (0xb4063508) 0 QObject (0xb4063508) 0
primary-for QObjectCleanupHandler (0xb426f5dc) primary-for QObjectCleanupHandler (0xb426f5dc)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb4063a48) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7f5e7bb99a90) 0
QObject (0x7f5e7bd82f60) 0 QObject (0x7f5e7bd82f60) 0
primary-for QObjectCleanupHandler (0x7f5e7bb99a90) primary-for QObjectCleanupHandler (0x7f5e7bb99a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f5e7bbad060) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb45532d0) 0
QObject (0xb4422038) 0 QObject (0xb4422038) 0
primary-for QObjectCleanupHandler (0xb45532d0) primary-for QObjectCleanupHandler (0xb45532d0)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb4422578) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7fdcea1e6a90) 0
QObject (0x7fdcea1e2120) 0 QObject (0x7fdcea1e2120) 0
primary-for QObjectCleanupHandler (0x7fdcea1e6a90) primary-for QObjectCleanupHandler (0x7fdcea1e6a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7fdcea1e21e0) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb44aa348) 0
QObject (0xb441f0a8) 0 QObject (0xb441f0a8) 0
primary-for QObjectCleanupHandler (0xb44aa348) primary-for QObjectCleanupHandler (0xb44aa348)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb441f5e8) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0x7f8720705a90) 0
QObject (0x7f87206474e0) 0 QObject (0x7f87206474e0) 0
primary-for QObjectCleanupHandler (0x7f8720705a90) primary-for QObjectCleanupHandler (0x7f8720705a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f87206475a0) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2407,11 +2407,6 @@ QObjectCleanupHandler (0xb42315dc) 0
QObject (0xb4025508) 0 QObject (0xb4025508) 0
primary-for QObjectCleanupHandler (0xb42315dc) primary-for QObjectCleanupHandler (0xb42315dc)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb4025a48) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2412,11 +2412,6 @@ QObjectCleanupHandler (0x7f6638185a90) 0
QObject (0x7f663836ef60) 0 QObject (0x7f663836ef60) 0
primary-for QObjectCleanupHandler (0x7f6638185a90) primary-for QObjectCleanupHandler (0x7f6638185a90)
Class QPointerBase
size=16 align=8
base size=16 base align=8
QPointerBase (0x7f663819a060) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -2412,11 +2412,6 @@ QObjectCleanupHandler (0xb457e2d0) 0
QObject (0xb444d038) 0 QObject (0xb444d038) 0
primary-for QObjectCleanupHandler (0xb457e2d0) primary-for QObjectCleanupHandler (0xb457e2d0)
Class QPointerBase
size=8 align=4
base size=8 base align=4
QPointerBase (0xb444d578) 0
Class QSharedMemory::QPrivateSignal Class QSharedMemory::QPrivateSignal
size=1 align=1 size=1 align=1
base size=0 base align=1 base size=0 base align=1

View File

@ -1657,6 +1657,10 @@ void tst_QLocale::ampm()
QLocale id("id_ID"); QLocale id("id_ID");
QCOMPARE(id.amText(), QLatin1String("AM")); QCOMPARE(id.amText(), QLatin1String("AM"));
QCOMPARE(id.pmText(), QLatin1String("PM")); QCOMPARE(id.pmText(), QLatin1String("PM"));
QLocale ta("ta_LK");
QCOMPARE(ta.amText(), QLatin1String("AM"));
QCOMPARE(ta.pmText(), QLatin1String("PM"));
} }
void tst_QLocale::dateFormat() void tst_QLocale::dateFormat()

View File

@ -2115,5 +2115,5 @@ void tst_QImage::cleanupFunctions()
} }
QTEST_MAIN(tst_QImage) QTEST_GUILESS_MAIN(tst_QImage)
#include "tst_qimage.moc" #include "tst_qimage.moc"

View File

@ -4,11 +4,11 @@ SUBDIRS=\
qsslcipher \ qsslcipher \
qsslerror \ qsslerror \
qsslkey \ qsslkey \
qsslsocket \
qsslsocket_onDemandCertificates_member \
qsslsocket_onDemandCertificates_static \
!contains(QT_CONFIG, private_tests): SUBDIRS -= \ contains(QT_CONFIG, openssl) | contains(QT_CONFIG, openssl-linked):
qsslsocket \ contains(QT_CONFIG, private_tests) {
qsslsocket_onDemandCertificates_member \ SUBDIRS += \
qsslsocket_onDemandCertificates_static \ qsslsocket \
qsslsocket_onDemandCertificates_member \
qsslsocket_onDemandCertificates_static \
}

View File

@ -58,6 +58,11 @@ public:
return QSqlResult::savePrepare(sqlquery); return QSqlResult::savePrepare(sqlquery);
} }
QVector<QVariant> boundValues() const
{
return QSqlResult::boundValues();
}
protected: protected:
QVariant data(int /* index */) { return QVariant(); } QVariant data(int /* index */) { return QVariant(); }
bool isNull(int /* index */) { return false; } bool isNull(int /* index */) { return false; }

View File

@ -53,6 +53,7 @@ public:
private slots: private slots:
void positionalToNamedBinding(); void positionalToNamedBinding();
void parseOfBoundValues();
}; };
@ -66,6 +67,39 @@ void tst_QSqlResult::positionalToNamedBinding()
TestSqlDriverResult result(&testDriver); TestSqlDriverResult result(&testDriver);
QString query("INSERT INTO MYTABLE (ID, NAME, BIRTH) VALUES(?, ?, ?)"); QString query("INSERT INTO MYTABLE (ID, NAME, BIRTH) VALUES(?, ?, ?)");
QVERIFY(result.savePrepare(query)); QVERIFY(result.savePrepare(query));
QCOMPARE(result.boundValues().count(), 3);
}
void tst_QSqlResult::parseOfBoundValues()
{
TestSqlDriver testDriver;
TestSqlDriverResult result(&testDriver);
QVERIFY(result.savePrepare("SELECT :1 AS \":2\""));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT :1 AS ':2'"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT :1 AS [:2]"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT :1 AS [:2]]]"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT :1 AS [:2]]]]]"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS \"?\""));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS '?'"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS [?]"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS \"'?\""));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS '?\"'"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS '?''?'"));
QCOMPARE(result.boundValues().count(), 1);
QVERIFY(result.savePrepare("SELECT ? AS [\"?']"));
QCOMPARE(result.boundValues().count(), 1);
} }
QTEST_MAIN( tst_QSqlResult ) QTEST_MAIN( tst_QSqlResult )

View File

@ -411,6 +411,7 @@ private slots:
void destroyedSignal(); void destroyedSignal();
void keyboardModifiers(); void keyboardModifiers();
void mouseDoubleClickBubbling_QTBUG29680();
private: private:
bool ensureScreenSize(int width, int height); bool ensureScreenSize(int width, int height);
@ -10047,5 +10048,30 @@ void tst_QWidget::keyboardModifiers()
QCOMPARE(int(w->m_appModifiers), int(Qt::ControlModifier)); QCOMPARE(int(w->m_appModifiers), int(Qt::ControlModifier));
} }
class DClickWidget : public QWidget
{
public:
DClickWidget() : triggered(false) {}
void mouseDoubleClickEvent(QMouseEvent *)
{
triggered = true;
}
bool triggered;
};
void tst_QWidget::mouseDoubleClickBubbling_QTBUG29680()
{
DClickWidget parent;
QWidget child(&parent);
parent.resize(200, 200);
child.resize(200, 200);
parent.show();
QVERIFY(QTest::qWaitForWindowExposed(&parent));
QTest::mouseDClick(&child, Qt::LeftButton);
QTRY_VERIFY(parent.triggered);
}
QTEST_MAIN(tst_QWidget) QTEST_MAIN(tst_QWidget)
#include "tst_qwidget.moc" #include "tst_qwidget.moc"

View File

@ -1602,7 +1602,7 @@ bool Configure::displayHelp()
desc( "-libdir <dir>", "Libraries will be installed to <dir>\n(default PREFIX/lib)"); desc( "-libdir <dir>", "Libraries will be installed to <dir>\n(default PREFIX/lib)");
desc( "-headerdir <dir>", "Headers will be installed to <dir>\n(default PREFIX/include)"); desc( "-headerdir <dir>", "Headers will be installed to <dir>\n(default PREFIX/include)");
desc( "-archdatadir <dir>", "Architecture-dependent data used by Qt will be installed to <dir>\n(default PREFIX)"); desc( "-archdatadir <dir>", "Architecture-dependent data used by Qt will be installed to <dir>\n(default PREFIX)");
desc( "-libexecdir <dir>", "Program executables will be installed to <dir>\n(default ARCHDATADIR/libexec)"); desc( "-libexecdir <dir>", "Program executables will be installed to <dir>\n(default ARCHDATADIR/lib)");
desc( "-plugindir <dir>", "Plugins will be installed to <dir>\n(default ARCHDATADIR/plugins)"); desc( "-plugindir <dir>", "Plugins will be installed to <dir>\n(default ARCHDATADIR/plugins)");
desc( "-importdir <dir>", "Imports for QML1 will be installed to <dir>\n(default ARCHDATADIR/imports)"); desc( "-importdir <dir>", "Imports for QML1 will be installed to <dir>\n(default ARCHDATADIR/imports)");
desc( "-qmldir <dir>", "Imports for QML2 will be installed to <dir>\n(default ARCHDATADIR/qml)"); desc( "-qmldir <dir>", "Imports for QML2 will be installed to <dir>\n(default ARCHDATADIR/qml)");
@ -3561,8 +3561,12 @@ void Configure::generateQConfigCpp()
dictionary["QT_INSTALL_LIBS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/lib"; dictionary["QT_INSTALL_LIBS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/lib";
if (!dictionary["QT_INSTALL_ARCHDATA"].size()) if (!dictionary["QT_INSTALL_ARCHDATA"].size())
dictionary["QT_INSTALL_ARCHDATA"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"]; dictionary["QT_INSTALL_ARCHDATA"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"];
if (!dictionary["QT_INSTALL_LIBEXECS"].size()) if (!dictionary["QT_INSTALL_LIBEXECS"].size()) {
dictionary["QT_INSTALL_LIBEXECS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/libexec"; if (dictionary["QT_INSTALL_ARCHDATA"] == dictionary["QT_INSTALL_PREFIX"])
dictionary["QT_INSTALL_LIBEXECS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/lib";
else
dictionary["QT_INSTALL_LIBEXECS"] = qipempty ? "" : dictionary["QT_INSTALL_ARCHDATA"] + "/libexec";
}
if (!dictionary["QT_INSTALL_BINS"].size()) if (!dictionary["QT_INSTALL_BINS"].size())
dictionary["QT_INSTALL_BINS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/bin"; dictionary["QT_INSTALL_BINS"] = qipempty ? "" : dictionary["QT_INSTALL_PREFIX"] + "/bin";
if (!dictionary["QT_INSTALL_PLUGINS"].size()) if (!dictionary["QT_INSTALL_PLUGINS"].size())