Merge "Merge remote-tracking branch 'origin/release' into stable" into refs/staging/stable
This commit is contained in:
commit
af47adede0
16
configure
vendored
16
configure
vendored
@ -5068,6 +5068,11 @@ if [ "$CFG_TSLIB" != "no" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check we actually have X11 :-)
|
||||
if compileTest x11/xlib "XLib"; then
|
||||
QT_CONFIG="$QT_CONFIG xlib"
|
||||
fi
|
||||
|
||||
if [ "$CFG_XCB" != "no" ]; then
|
||||
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; then
|
||||
QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`"
|
||||
@ -5113,17 +5118,6 @@ if [ "$CFG_XCB" != "no" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check for X11. Eventually we should port everything to XCB,
|
||||
# but for now the port is incomplete and Xlib is a requirement.
|
||||
if compileTest x11/xlib "XLib"; then
|
||||
QT_CONFIG="$QT_CONFIG xlib"
|
||||
else
|
||||
echo "The test for linking against Xlib failed!"
|
||||
echo " You might need to install dependency packages."
|
||||
echo " See src/plugins/platforms/xcb/README."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$CFG_XCB_XLIB" != "no" ]; then
|
||||
if compileTest qpa/xcb-xlib "xcb-xlib" $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
|
||||
QT_CONFIG="$QT_CONFIG xcb-xlib"
|
||||
|
64
dist/changes-5.2.0
vendored
64
dist/changes-5.2.0
vendored
@ -52,6 +52,29 @@ information about a particular change.
|
||||
zero delta() in order to indicate beginning and end of transient
|
||||
scrolling.
|
||||
|
||||
- Mac OS X framework builds of Qt no longer contain a Unix-like include/
|
||||
directory; all headers are located in the frameworks. This may affect
|
||||
3rd party build systems not based on qmake or cmake.
|
||||
|
||||
****************************************************************************
|
||||
* Platform deprecation notice *
|
||||
****************************************************************************
|
||||
|
||||
- The support for the old implementation of QAtomicInt and
|
||||
QAtomicPointer is deprecated in Qt 5.2 and will be removed in Qt
|
||||
5.3. Building with the following compilers or environments will not
|
||||
be possible in Qt 5.3 or the build will suffer greatly in
|
||||
performance, unless support is revived by writing new atomics code.
|
||||
* Green Hills compiler for INTEGRITY
|
||||
* Sun Studio compiler suite for Solaris
|
||||
* IBM Visual Age compiler suite for AIX
|
||||
* Kernel-mode VxWorks
|
||||
|
||||
Developers interested in picking up support should contact the
|
||||
development mailing list at development@qt-project.org for more
|
||||
information. Note that those platforms are currently not tested. Most
|
||||
likely, they have further problems than just the atomics code.
|
||||
|
||||
****************************************************************************
|
||||
* Library *
|
||||
****************************************************************************
|
||||
@ -700,3 +723,44 @@ X11
|
||||
- [QTBUG-31762] Fix position of system tray icon (except Unity)
|
||||
- [QTBUG-27349] Reintroduced command line argument for positioning
|
||||
windows (-geometry)
|
||||
|
||||
****************************************************************************
|
||||
* Tools *
|
||||
****************************************************************************
|
||||
|
||||
- configure
|
||||
|
||||
* Added option to disable the QtMultimedia WMF backend
|
||||
* [Unix] Added option to build with gcov support
|
||||
* Added -extprefix option to support Qt installing into a different
|
||||
location than the on-device -prefix within the -sysroot.
|
||||
* [QTBUG-33584][Unix] Fixed parsing of -device-option with equal signs.
|
||||
|
||||
- cmake config files
|
||||
|
||||
* [QTBUG-33145] Fixed usage of non-QtBase modules with Qt compiled from
|
||||
source tarballs.
|
||||
* [QTBUG-33223] Fixed header file location on multi-arch systems.
|
||||
* Added support for automatic packaging of Qt plugins with cpack.
|
||||
|
||||
- qmake
|
||||
|
||||
* [QTBUG-491] Added saner approach to debug/release path rewriting.
|
||||
* Added the parseJson() function.
|
||||
* Added "osx" scope as an alias for "macx". Note that matching on the
|
||||
makespec is generally deprecated - use "linux", "gcc", etc.
|
||||
* Added support for .qmake.stash files which are really *just* caches.
|
||||
* [Xcode] Added support for QMAKE_PRE_LINK and QMAKE_POST_LINK.
|
||||
* [QTBUG-31129] Added installation of PDB files for dlltarget.
|
||||
* [QTBUG-28102] Added support for querying disabled Qt features.
|
||||
* Removed macx-clang-libc++* makespecs. libc++ is now handled automatically.
|
||||
* [QTBUG-32912][MSVS] Fixed moc not being run in case of DBUS_ADAPTORS or
|
||||
DBUS_INTERFACES being present.
|
||||
* [QTBUG-30644] Fixed unsatisfied requires() breaking recursive targets.
|
||||
* [QTBUG-31204] Fixed extra compilers not finding their inputs.
|
||||
* [QTBUG-32885][MSVS] Made it possible to disable debug information.
|
||||
* [QTBUG-33446][MSVS] Fixed generation of VS2010+ solution files.
|
||||
* [QTBUG-32375][MSVS] Fixed output directory of nested projects.
|
||||
* [QTBUG-34392][MSVS] Fixed /SAFESEH:NO with VS2010+.
|
||||
* [QTBUG-34357][MSVS] Fixed breakage with multiple VS versions in PATH.
|
||||
* [MSVS] Fixed sub-project dependency generation.
|
||||
|
@ -131,30 +131,33 @@ android: CONFIG += qt_android_deps
|
||||
#install directives
|
||||
load(qt_installs)
|
||||
|
||||
!isEmpty(_QMAKE_SUPER_CACHE_): \
|
||||
rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*
|
||||
else: \
|
||||
rplbase = $$MODULE_BASE_OUTDIR
|
||||
include_replace.match = $$rplbase/include
|
||||
include_replace.replace = $$[QT_INSTALL_HEADERS/raw]
|
||||
include_replace.CONFIG = path
|
||||
lib_replace.match = $$rplbase/lib
|
||||
host_build: \
|
||||
lib_replace.replace = $$[QT_HOST_LIBS]
|
||||
else: \
|
||||
lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
|
||||
lib_replace.CONFIG = path
|
||||
QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace
|
||||
|
||||
unix|win32-g++* {
|
||||
CONFIG += create_pc
|
||||
host_build: \
|
||||
QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS]
|
||||
else: \
|
||||
QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw]
|
||||
QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw]
|
||||
QMAKE_PKGCONFIG_LIBDIR = $$lib_replace.replace
|
||||
QMAKE_PKGCONFIG_INCDIR = $$include_replace.replace
|
||||
QMAKE_PKGCONFIG_CFLAGS = -I${includedir}/$$MODULE_INCNAME
|
||||
QMAKE_PKGCONFIG_DESTDIR = pkgconfig
|
||||
!isEmpty(_QMAKE_SUPER_CACHE_): \
|
||||
rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*
|
||||
else: \
|
||||
rplbase = $$MODULE_BASE_OUTDIR
|
||||
include_replace.match = $$rplbase/include
|
||||
include_replace.replace = $$[QT_INSTALL_HEADERS/raw]
|
||||
lib_replace.match = $$rplbase/lib
|
||||
lib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR
|
||||
QMAKE_PKGCONFIG_INSTALL_REPLACE += include_replace lib_replace
|
||||
QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace
|
||||
}
|
||||
|
||||
unix {
|
||||
CONFIG += create_libtool explicitlib
|
||||
QMAKE_LIBTOOL_LIBDIR = $$QMAKE_PKGCONFIG_LIBDIR
|
||||
QMAKE_LIBTOOL_LIBDIR = $$lib_replace.replace
|
||||
QMAKE_LIBTOOL_INSTALL_REPLACE += include_replace lib_replace
|
||||
}
|
||||
|
||||
|
@ -192,6 +192,22 @@ macx-xcode {
|
||||
QMAKE_CXXFLAGS += -stdlib=libstdc++
|
||||
QMAKE_LFLAGS += -stdlib=libstdc++
|
||||
}
|
||||
|
||||
# Make the default debug information format for debug builds
|
||||
# DWARF instead of DWARF with dSYM. This cuts down build times
|
||||
# for application debug builds significantly, as Xcode doesn't
|
||||
# have to pull out all the DWARF info from our static libraries
|
||||
# and put it into a dSYM file. We don't need that dSYM file in
|
||||
# the first place, since the information is available in the
|
||||
# object files inside the archives (static libraries). The only
|
||||
# unfortunate side effect of this is that the user won't be
|
||||
# able to break on specific lines of main(). This is due to
|
||||
# using ld to rename the main-function, and will go away once
|
||||
# we implement a separate tool to do the symbol renaming.
|
||||
debug_information_format.name = DEBUG_INFORMATION_FORMAT
|
||||
debug_information_format.value = dwarf
|
||||
debug_information_format.build = debug
|
||||
QMAKE_MAC_XCODE_SETTINGS += debug_information_format
|
||||
}
|
||||
|
||||
macx-xcode {
|
||||
|
@ -1140,7 +1140,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||
//###
|
||||
}
|
||||
|
||||
project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key);
|
||||
project->values("QMAKE_PBX_BUILDPHASES").append(phase_key);
|
||||
t << "\t\t" << phase_key << " = {\n"
|
||||
<< "\t\t\t" << writeSettings("name", "Copy '" + bundle_data[i] + "' Files to Bundle") << ";\n"
|
||||
<< "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n"
|
||||
|
@ -3336,6 +3336,13 @@ MakefileGenerator::writePkgConfigFile()
|
||||
t << endl;
|
||||
}
|
||||
|
||||
static QString windowsifyPath(const QString &str)
|
||||
{
|
||||
// The paths are escaped in prl files, so every slash needs to turn into two backslashes.
|
||||
// Then each backslash needs to be escaped for sed. And another level for C quoting here.
|
||||
return QString(str).replace('/', "\\\\\\\\");
|
||||
}
|
||||
|
||||
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
|
||||
{
|
||||
QString ret;
|
||||
@ -3348,8 +3355,12 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
|
||||
for (int r = 0; r < replace_rules.size(); ++r) {
|
||||
const ProString match = project->first(ProKey(replace_rules.at(r) + ".match")),
|
||||
replace = project->first(ProKey(replace_rules.at(r) + ".replace"));
|
||||
if (!match.isEmpty() /*&& match != replace*/)
|
||||
if (!match.isEmpty() /*&& match != replace*/) {
|
||||
ret += " -e " + shellQuote("s," + match + "," + replace + ",g");
|
||||
if (isWindowsShell() && project->first(ProKey(replace_rules.at(r) + ".CONFIG")).contains("path"))
|
||||
ret += " -e " + shellQuote("s," + windowsifyPath(match.toQString())
|
||||
+ "," + windowsifyPath(replace.toQString()) + ",gi");
|
||||
}
|
||||
}
|
||||
ret += " \"" + src + "\" >\"" + dst + "\"";
|
||||
}
|
||||
|
@ -85,6 +85,7 @@ static int doSed(int argc, char **argv)
|
||||
return 3;
|
||||
}
|
||||
QChar sep = ++j < cmd.length() ? cmd.at(j) : QChar();
|
||||
Qt::CaseSensitivity matchcase = Qt::CaseSensitive;
|
||||
bool escaped = false;
|
||||
int phase = 1;
|
||||
QStringList phases;
|
||||
@ -126,12 +127,16 @@ static int doSed(int argc, char **argv)
|
||||
fprintf(stderr, "Error: sed s command requires three arguments (%d, %c, %s)\n", phase, sep.toLatin1(), qPrintable(curr));
|
||||
return 3;
|
||||
}
|
||||
if (curr.contains(QLatin1Char('i'))) {
|
||||
curr.remove(QLatin1Char('i'));
|
||||
matchcase = Qt::CaseInsensitive;
|
||||
}
|
||||
if (curr != QLatin1String("g")) {
|
||||
fprintf(stderr, "Error: sed s command must be used with the g option (only)\n");
|
||||
fprintf(stderr, "Error: sed s command supports only g & i options; g is required\n");
|
||||
return 3;
|
||||
}
|
||||
SedSubst subst;
|
||||
subst.from = QRegExp(phases.at(0));
|
||||
subst.from = QRegExp(phases.at(0), matchcase);
|
||||
subst.to = phases.at(1);
|
||||
subst.to.replace("\\\\", "\\"); // QString::replace(rx, sub) groks \1, but not \\.
|
||||
substs << subst;
|
||||
|
@ -181,7 +181,7 @@ mkspecs.path = $$[QT_HOST_DATA]/mkspecs
|
||||
mkspecs.files = \
|
||||
$$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qdevice.pri $$OUT_PWD/mkspecs/qfeatures.pri \
|
||||
$$files($$PWD/mkspecs/*)
|
||||
mkspecs.files -= $$PWD/mkspecs/modules
|
||||
mkspecs.files -= $$PWD/mkspecs/modules $$PWD/mkspecs/modules-inst
|
||||
INSTALLS += mkspecs
|
||||
|
||||
global_docs.files = $$PWD/doc/global
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<resources>
|
||||
<array name="qt_sources">
|
||||
<item>https://download.qt-project.org/ministro/android/qt5/latest</item>
|
||||
<item>https://download.qt-project.org/ministro/android/qt5/qt-5.2</item>
|
||||
</array>
|
||||
|
||||
<!-- The following is handled automatically by the deployment tool. It should
|
||||
|
@ -150,7 +150,7 @@ public class QtActivity extends Activity
|
||||
|
||||
private ActivityInfo m_activityInfo = null; // activity info object, used to access the libs and the strings
|
||||
private DexClassLoader m_classLoader = null; // loader object
|
||||
private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/latest"}; // Make sure you are using ONLY secure locations
|
||||
private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/qt-5.2"}; // Make sure you are using ONLY secure locations
|
||||
private String m_repository = "default"; // Overwrites the default Ministro repository
|
||||
// Possible values:
|
||||
// * default - Ministro default repository set with "Ministro configuration tool".
|
||||
|
@ -102,10 +102,19 @@ public:
|
||||
{
|
||||
if (dirty) {
|
||||
dirty = false;
|
||||
|
||||
// This is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800
|
||||
// Avoid using std::nth_element for stdlibc++ <= 4.7.3 || (>= 4.8.0 && <= 4.8.2)
|
||||
#if defined(__GLIBCXX__) && (__GLIBCXX__ <= 20130411 || (__GLIBCXX__ >= 20130322 && __GLIBCXX__ <= 20131016))
|
||||
QVector<T> sorted = values;
|
||||
std::sort(sorted.begin(), sorted.end());
|
||||
currentMedian = sorted.at(bufferSize / 2);
|
||||
#else
|
||||
QVector<T> copy = values;
|
||||
typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end();
|
||||
std::nth_element(begin, mid, end);
|
||||
currentMedian = *mid;
|
||||
#endif
|
||||
}
|
||||
return currentMedian;
|
||||
}
|
||||
|
@ -556,10 +556,8 @@ Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
|
||||
\typedef qreal
|
||||
\relates <QtGlobal>
|
||||
|
||||
Typedef for \c double on all platforms except for those using CPUs with
|
||||
ARM architectures.
|
||||
On ARM-based platforms, \c qreal is a typedef for \c float for performance
|
||||
reasons.
|
||||
Typedef for \c double unless Qt is configured with the
|
||||
\c{-qreal float} option.
|
||||
*/
|
||||
|
||||
/*! \typedef uchar
|
||||
|
@ -74,7 +74,8 @@ static jclass getCachedClass(JNIEnv *env, const char *className)
|
||||
if (!classLoader.isValid())
|
||||
return 0;
|
||||
|
||||
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QLatin1String(className));
|
||||
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QString::fromLatin1(className).replace(QLatin1Char('/'),
|
||||
QLatin1Char('.')));
|
||||
QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
|
||||
"(Ljava/lang/String;)Ljava/lang/Class;",
|
||||
stringName.object());
|
||||
|
@ -2996,6 +2996,10 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
|
||||
expensive initialization only if something is connected to a
|
||||
signal.
|
||||
|
||||
\warning This function is called from the thread which performs the
|
||||
connection, which may be a different thread from the thread in
|
||||
which this object lives.
|
||||
|
||||
\sa connect(), disconnectNotify()
|
||||
*/
|
||||
|
||||
@ -3022,6 +3026,15 @@ void QObject::connectNotify(const QMetaMethod &signal)
|
||||
modularity. However, it might be useful for optimizing access to
|
||||
expensive resources.
|
||||
|
||||
\warning This function is called from the thread which performs the
|
||||
disconnection, which may be a different thread from the thread in
|
||||
which this object lives. This function may also be called with a QObject
|
||||
internal mutex locked. It is therefore not allowed to re-enter any
|
||||
of any QObject functions from your reimplementation and if you lock
|
||||
a mutex in your reimplementation, make sure that you don't call QObject
|
||||
functions with that mutex held in other places or it will result in
|
||||
a deadlock.
|
||||
|
||||
\sa disconnect(), connectNotify()
|
||||
*/
|
||||
|
||||
|
@ -71,6 +71,7 @@ class QTextCursor;
|
||||
|
||||
template<typename T> class QVector;
|
||||
|
||||
#ifndef Q_QDOC // Workaround for QTBUG-35230
|
||||
namespace Qt
|
||||
{
|
||||
Q_GUI_EXPORT bool mightBeRichText(const QString&);
|
||||
@ -80,6 +81,7 @@ namespace Qt
|
||||
Q_GUI_EXPORT QTextCodec *codecForHtml(const QByteArray &ba);
|
||||
#endif
|
||||
}
|
||||
#endif // Q_QDOC
|
||||
|
||||
class Q_GUI_EXPORT QAbstractUndoItem
|
||||
{
|
||||
|
@ -192,8 +192,6 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface)
|
||||
QWindow *window = static_cast<QCocoaWindow *>(surface)->window();
|
||||
setActiveWindow(window);
|
||||
|
||||
if (![m_context view])
|
||||
return false;
|
||||
[m_context makeCurrentContext];
|
||||
update();
|
||||
return true;
|
||||
|
@ -159,8 +159,10 @@ public:
|
||||
void registerTouch(bool enable);
|
||||
|
||||
qreal devicePixelRatio() const;
|
||||
bool isWindowExposable();
|
||||
void exposeWindow();
|
||||
void obscureWindow();
|
||||
void updateExposedGeometry();
|
||||
QWindow *childWindowAt(QPoint windowPoint);
|
||||
protected:
|
||||
// NSWindow handling. The QCocoaWindow/QNSView can either be displayed
|
||||
@ -202,7 +204,9 @@ public: // for QNSView
|
||||
|
||||
bool m_hasModalSession;
|
||||
bool m_frameStrutEventsEnabled;
|
||||
bool m_geometryUpdateExposeAllowed;
|
||||
bool m_isExposed;
|
||||
QRect m_exposedGeometry;
|
||||
int m_registerTouchCount;
|
||||
bool m_resizableTransientParent;
|
||||
bool m_overrideBecomeKey;
|
||||
|
@ -213,6 +213,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
|
||||
, m_windowCursor(0)
|
||||
, m_hasModalSession(false)
|
||||
, m_frameStrutEventsEnabled(false)
|
||||
, m_geometryUpdateExposeAllowed(false)
|
||||
, m_isExposed(false)
|
||||
, m_registerTouchCount(0)
|
||||
, m_resizableTransientParent(false)
|
||||
@ -1084,22 +1085,61 @@ qreal QCocoaWindow::devicePixelRatio() const
|
||||
}
|
||||
}
|
||||
|
||||
// Returns whether the window can be expose, which it can
|
||||
// if it is on screen and has a valid geometry.
|
||||
bool QCocoaWindow::isWindowExposable()
|
||||
{
|
||||
QSize size = geometry().size();
|
||||
bool validGeometry = (size.width() > 0 && size.height() > 0);
|
||||
bool validScreen = ([[m_contentView window] screen] != 0);
|
||||
bool nonHiddenSuperView = ![[m_contentView superview] isHidden];
|
||||
return (validGeometry && validScreen && nonHiddenSuperView);
|
||||
}
|
||||
|
||||
// Exposes the window by posting an expose event to QWindowSystemInterface
|
||||
void QCocoaWindow::exposeWindow()
|
||||
{
|
||||
if (!m_isExposed && ![[m_contentView superview] isHidden]) {
|
||||
m_geometryUpdateExposeAllowed = true;
|
||||
|
||||
if (!isWindowExposable())
|
||||
return;
|
||||
|
||||
if (!m_isExposed) {
|
||||
m_isExposed = true;
|
||||
m_exposedGeometry = geometry();
|
||||
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
|
||||
}
|
||||
}
|
||||
|
||||
// Obscures the window by posting an empty expose event to QWindowSystemInterface
|
||||
void QCocoaWindow::obscureWindow()
|
||||
{
|
||||
if (m_isExposed) {
|
||||
m_geometryUpdateExposeAllowed = false;
|
||||
m_isExposed = false;
|
||||
QWindowSystemInterface::handleExposeEvent(window(), QRegion());
|
||||
}
|
||||
}
|
||||
|
||||
// Updates window geometry by posting an expose event to QWindowSystemInterface
|
||||
void QCocoaWindow::updateExposedGeometry()
|
||||
{
|
||||
// updateExposedGeometry is not allowed to send the initial expose. If you want
|
||||
// that call exposeWindow();
|
||||
if (!m_geometryUpdateExposeAllowed)
|
||||
return;
|
||||
|
||||
if (!isWindowExposable())
|
||||
return;
|
||||
|
||||
if (m_exposedGeometry == geometry())
|
||||
return;
|
||||
|
||||
m_isExposed = true;
|
||||
m_exposedGeometry = geometry();
|
||||
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
|
||||
}
|
||||
|
||||
QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint)
|
||||
{
|
||||
QWindow *targetWindow = window();
|
||||
|
@ -93,6 +93,8 @@ QT_END_NAMESPACE
|
||||
- (BOOL)hasMask;
|
||||
- (BOOL)isOpaque;
|
||||
|
||||
- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint;
|
||||
|
||||
- (void)resetMouseButtons;
|
||||
|
||||
- (void)handleMouseEvent:(NSEvent *)theEvent;
|
||||
|
@ -175,7 +175,7 @@ static QTouchDevice *touchDevice = 0;
|
||||
- (void) globalFrameChanged:(NSNotification*)notification
|
||||
{
|
||||
Q_UNUSED(notification);
|
||||
QWindowSystemInterface::handleExposeEvent(m_window, m_window->geometry());
|
||||
m_platformWindow->updateExposedGeometry();
|
||||
}
|
||||
|
||||
- (void)viewDidMoveToSuperview
|
||||
@ -186,7 +186,7 @@ static QTouchDevice *touchDevice = 0;
|
||||
if ([self superview]) {
|
||||
m_platformWindow->m_contentViewIsEmbedded = true;
|
||||
QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry());
|
||||
QWindowSystemInterface::handleExposeEvent(m_window, m_platformWindow->geometry());
|
||||
m_platformWindow->updateExposedGeometry();
|
||||
QWindowSystemInterface::flushWindowSystemEvents();
|
||||
} else {
|
||||
m_platformWindow->m_contentViewIsEmbedded = false;
|
||||
@ -261,7 +261,7 @@ static QTouchDevice *touchDevice = 0;
|
||||
// Send a geometry change event to Qt, if it's ready to handle events
|
||||
if (!m_platformWindow->m_inConstructor) {
|
||||
QWindowSystemInterface::handleGeometryChange(m_window, geometry);
|
||||
QWindowSystemInterface::handleExposeEvent(m_window, geometry);
|
||||
m_platformWindow->updateExposedGeometry();
|
||||
QWindowSystemInterface::flushWindowSystemEvents();
|
||||
}
|
||||
}
|
||||
|
@ -53,6 +53,7 @@
|
||||
|
||||
- (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow;
|
||||
|
||||
- (void)windowDidBecomeKey:(NSNotification *)notification;
|
||||
- (void)windowDidResize:(NSNotification *)notification;
|
||||
- (void)windowDidMove:(NSNotification *)notification;
|
||||
- (void)windowWillMove:(NSNotification *)notification;
|
||||
|
@ -56,6 +56,17 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)windowDidBecomeKey:(NSNotification *)notification
|
||||
{
|
||||
Q_UNUSED(notification);
|
||||
if (m_cocoaWindow->m_windowUnderMouse) {
|
||||
QPointF windowPoint;
|
||||
QPointF screenPoint;
|
||||
[m_cocoaWindow->m_qtView convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
|
||||
QWindowSystemInterface::handleEnterEvent(m_cocoaWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)windowDidResize:(NSNotification *)notification
|
||||
{
|
||||
Q_UNUSED(notification);
|
||||
|
@ -206,13 +206,6 @@ namespace
|
||||
bool debugStackUsage = false;
|
||||
}
|
||||
|
||||
static int infoPlistValue(NSString* key, int defaultValue)
|
||||
{
|
||||
static NSBundle *bundle = [NSBundle mainBundle];
|
||||
NSNumber* value = [bundle objectForInfoDictionaryKey:key];
|
||||
return value ? [value intValue] : defaultValue;
|
||||
}
|
||||
|
||||
extern "C" int __attribute__((weak)) main(int argc, char *argv[])
|
||||
{
|
||||
@autoreleasepool {
|
||||
|
@ -61,6 +61,7 @@ QPointF fromCGPoint(const CGPoint &point);
|
||||
Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientation);
|
||||
UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation);
|
||||
QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen);
|
||||
int infoPlistValue(NSString* key, int defaultValue);
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
@ -134,5 +134,12 @@ QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen)
|
||||
: QRect(rect.y(), geometry.height() - rect.width() - rect.x(), rect.height(), rect.width());
|
||||
}
|
||||
|
||||
int infoPlistValue(NSString* key, int defaultValue)
|
||||
{
|
||||
static NSBundle *bundle = [NSBundle mainBundle];
|
||||
NSNumber* value = [bundle objectForInfoDictionaryKey:key];
|
||||
return value ? [value intValue] : defaultValue;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
@ -270,7 +270,7 @@ void QIOSInputContext::scrollRootView()
|
||||
&& m_keyboardListener->m_keyboardVisibleAndDocked
|
||||
&& m_focusView.window == view.window) {
|
||||
QRectF cursorRect = qGuiApp->inputMethod()->cursorRectangle();
|
||||
cursorRect.translate(qGuiApp->focusWindow()->geometry().topLeft());
|
||||
cursorRect.translate(m_focusView.qwindow->geometry().topLeft());
|
||||
qreal keyboardY = m_keyboardListener->m_keyboardEndRect.y();
|
||||
int statusBarY = qGuiApp->primaryScreen()->availableGeometry().y();
|
||||
const int margin = 20;
|
||||
|
@ -74,6 +74,8 @@ public:
|
||||
QStringList themeNames() const;
|
||||
QPlatformTheme *createPlatformTheme(const QString &name) const;
|
||||
|
||||
QPlatformDrag *drag() const Q_DECL_OVERRIDE { return 0; }
|
||||
|
||||
QAbstractEventDispatcher *createEventDispatcher() const;
|
||||
QPlatformNativeInterface *nativeInterface() const;
|
||||
|
||||
|
@ -101,12 +101,15 @@
|
||||
|
||||
- (BOOL)prefersStatusBarHidden
|
||||
{
|
||||
static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false);
|
||||
if (hiddenFromPlist)
|
||||
return YES;
|
||||
QWindow *focusWindow = QGuiApplication::focusWindow();
|
||||
if (!focusWindow)
|
||||
if (!focusWindow || !focusWindow->handle())
|
||||
return [UIApplication sharedApplication].statusBarHidden;
|
||||
|
||||
QIOSWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
|
||||
return topLevel->window()->windowState() == Qt::WindowFullScreen;
|
||||
QWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
|
||||
return topLevel->windowState() == Qt::WindowFullScreen;
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -87,7 +87,7 @@ public:
|
||||
|
||||
WId winId() const { return WId(m_view); };
|
||||
|
||||
QIOSWindow *topLevelWindow() const;
|
||||
QWindow *topLevelWindow() const;
|
||||
|
||||
private:
|
||||
void applyGeometry(const QRect &rect);
|
||||
|
@ -108,8 +108,6 @@
|
||||
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
|
||||
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
|
||||
|
||||
[self updateTextInputTraits];
|
||||
|
||||
if (isQtApplication())
|
||||
self.hidden = YES;
|
||||
|
||||
@ -330,13 +328,9 @@
|
||||
|
||||
- (BOOL)becomeFirstResponder
|
||||
{
|
||||
// On iOS, a QWindow should only have input focus when the input panel is
|
||||
// open. This is to stop cursors and focus rects from being drawn when the
|
||||
// user cannot type. And since the keyboard will open when a view becomes
|
||||
// the first responder, it's now a good time to inform QPA that the QWindow
|
||||
// this view backs became active:
|
||||
// Note: QIOSInputContext controls our first responder status based on
|
||||
// whether or not the keyboard should be open or closed.
|
||||
[self updateTextInputTraits];
|
||||
QWindowSystemInterface::handleWindowActivated(m_qioswindow->window());
|
||||
return [super becomeFirstResponder];
|
||||
}
|
||||
|
||||
@ -345,7 +339,8 @@
|
||||
// Resigning first responed status means that the virtual keyboard was closed, or
|
||||
// some other view became first responder. In either case we clear the focus object to
|
||||
// avoid blinking cursors in line edits etc:
|
||||
static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
|
||||
if (m_qioswindow)
|
||||
static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
|
||||
return [super resignFirstResponder];
|
||||
}
|
||||
|
||||
@ -427,8 +422,10 @@
|
||||
|
||||
- (QWindow *)qwindow
|
||||
{
|
||||
if ([self isKindOfClass:[QUIView class]])
|
||||
return static_cast<QUIView *>(self)->m_qioswindow->window();
|
||||
if ([self isKindOfClass:[QUIView class]]) {
|
||||
if (QIOSWindow *w = static_cast<QUIView *>(self)->m_qioswindow)
|
||||
return w->window();
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@ -473,6 +470,7 @@ QIOSWindow::~QIOSWindow()
|
||||
// cancellation of all touch events.
|
||||
[m_view touchesCancelled:0 withEvent:0];
|
||||
|
||||
m_view->m_qioswindow = 0;
|
||||
[m_view removeFromSuperview];
|
||||
[m_view release];
|
||||
}
|
||||
@ -637,7 +635,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow)
|
||||
}
|
||||
}
|
||||
|
||||
QIOSWindow *QIOSWindow::topLevelWindow() const
|
||||
QWindow *QIOSWindow::topLevelWindow() const
|
||||
{
|
||||
QWindow *window = this->window();
|
||||
while (window) {
|
||||
@ -651,7 +649,7 @@ QIOSWindow *QIOSWindow::topLevelWindow() const
|
||||
window = parent;
|
||||
}
|
||||
|
||||
return static_cast<QIOSWindow *>(window->handle());
|
||||
return window;
|
||||
}
|
||||
|
||||
void QIOSWindow::requestActivateWindow()
|
||||
|
@ -334,14 +334,14 @@ QString Generator::fileBase(const Node *node) const
|
||||
if (node->isQmlNode()) {
|
||||
if (!node->qmlModuleName().isEmpty()) {
|
||||
base.prepend(node->qmlModuleName() + QLatin1Char('-'));
|
||||
/*
|
||||
To avoid file name conflicts in the html directory,
|
||||
we prepend a prefix (by default, "qml-") to the file name of QML
|
||||
element doc files.
|
||||
*/
|
||||
if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) {
|
||||
base.prepend(outputPrefix(QLatin1String("QML")));
|
||||
}
|
||||
}
|
||||
/*
|
||||
To avoid file name conflicts in the html directory,
|
||||
we prepend a prefix (by default, "qml-") to the file name of QML
|
||||
element doc files.
|
||||
*/
|
||||
if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) {
|
||||
base.prepend(outputPrefix(QLatin1String("QML")));
|
||||
}
|
||||
}
|
||||
else if (node->subType() == Node::QmlModule) {
|
||||
|
@ -269,6 +269,9 @@ QString HtmlGenerator::format()
|
||||
void HtmlGenerator::generateTree()
|
||||
{
|
||||
qdb_->buildCollections();
|
||||
Node* qflags = qdb_->findNodeByNameAndType(QStringList("QFlags"), Node::Class, Node::NoSubType);
|
||||
if (qflags)
|
||||
qflagsHref_ = linkForNode(qflags,0);
|
||||
if (!runPrepareOnly()) {
|
||||
Generator::generateTree();
|
||||
generateCollisionPages();
|
||||
@ -3660,7 +3663,7 @@ void HtmlGenerator::generateDetailedMember(const Node *node,
|
||||
if (enume->flagsType()) {
|
||||
out() << "<p>The " << protectEnc(enume->flagsType()->name())
|
||||
<< " type is a typedef for "
|
||||
<< "<a href=\"qflags.html\">QFlags</a><"
|
||||
<< "<a href=\"" << qflagsHref_ << "\">QFlags</a><"
|
||||
<< protectEnc(enume->name())
|
||||
<< ">. It stores an OR combination of "
|
||||
<< protectEnc(enume->name())
|
||||
|
@ -262,6 +262,7 @@ private:
|
||||
QString cppclassespage;
|
||||
QString qmltypespage;
|
||||
QString buildversion;
|
||||
QString qflagsHref_;
|
||||
|
||||
public:
|
||||
static bool debugging_on;
|
||||
|
@ -7634,7 +7634,10 @@ QGraphicsObject::~QGraphicsObject()
|
||||
bool QGraphicsObject::event(QEvent *ev)
|
||||
{
|
||||
if (ev->type() == QEvent::StyleAnimationUpdate) {
|
||||
update();
|
||||
if (isVisible()) {
|
||||
ev->accept();
|
||||
update();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return QObject::event(ev);
|
||||
|
@ -1409,9 +1409,14 @@ bool QGraphicsWidget::event(QEvent *event)
|
||||
break;
|
||||
case QEvent::WindowActivate:
|
||||
case QEvent::WindowDeactivate:
|
||||
case QEvent::StyleAnimationUpdate:
|
||||
update();
|
||||
break;
|
||||
case QEvent::StyleAnimationUpdate:
|
||||
if (isVisible()) {
|
||||
event->accept();
|
||||
update();
|
||||
}
|
||||
break;
|
||||
// Taken from QWidget::event
|
||||
case QEvent::ActivationChange:
|
||||
case QEvent::EnabledChange:
|
||||
|
@ -8249,7 +8249,10 @@ bool QWidget::event(QEvent *event)
|
||||
update(static_cast<QUpdateLaterEvent*>(event)->region());
|
||||
break;
|
||||
case QEvent::StyleAnimationUpdate:
|
||||
update();
|
||||
if (isVisible() && !window()->isMinimized()) {
|
||||
event->accept();
|
||||
update();
|
||||
}
|
||||
break;
|
||||
|
||||
case QEvent::WindowBlocked:
|
||||
|
@ -619,7 +619,7 @@ void QStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, c
|
||||
void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
|
||||
const QPixmap &pixmap) const
|
||||
{
|
||||
int scale = pixmap.devicePixelRatio();
|
||||
qreal scale = pixmap.devicePixelRatio();
|
||||
QRect aligned = alignedRect(QApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect);
|
||||
QRect inter = aligned.intersected(rect);
|
||||
|
||||
|
@ -93,7 +93,10 @@ void QStyleAnimation::setStartTime(const QTime &time)
|
||||
void QStyleAnimation::updateTarget()
|
||||
{
|
||||
QEvent event(QEvent::StyleAnimationUpdate);
|
||||
event.setAccepted(false);
|
||||
QCoreApplication::sendEvent(target(), &event);
|
||||
if (!event.isAccepted())
|
||||
stop();
|
||||
}
|
||||
|
||||
bool QStyleAnimation::isUpdateNeeded() const
|
||||
@ -103,16 +106,8 @@ bool QStyleAnimation::isUpdateNeeded() const
|
||||
|
||||
void QStyleAnimation::updateCurrentTime(int)
|
||||
{
|
||||
if (QObject *tgt = target()) {
|
||||
if (tgt->isWidgetType()) {
|
||||
QWidget *widget = static_cast<QWidget *>(tgt);
|
||||
if (!widget->isVisible() || widget->window()->isMinimized())
|
||||
stop();
|
||||
}
|
||||
|
||||
if (isUpdateNeeded())
|
||||
updateTarget();
|
||||
}
|
||||
if (target() && isUpdateNeeded())
|
||||
updateTarget();
|
||||
}
|
||||
|
||||
QProgressStyleAnimation::QProgressStyleAnimation(int speed, QObject *target) :
|
||||
|
@ -3073,7 +3073,7 @@ void QComboBox::wheelEvent(QWheelEvent *e)
|
||||
newIndex--;
|
||||
while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
|
||||
newIndex--;
|
||||
} else {
|
||||
} else if (e->delta() < 0) {
|
||||
newIndex++;
|
||||
while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
|
||||
newIndex++;
|
||||
|
@ -31,8 +31,7 @@ load(qt_targets)
|
||||
|
||||
wince*:QMAKE_POST_LINK =
|
||||
|
||||
unix|win32-g++* {
|
||||
lib_replace.match = $$[QT_INSTALL_LIBS/get]
|
||||
lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
|
||||
QMAKE_PRL_INSTALL_REPLACE += lib_replace
|
||||
}
|
||||
lib_replace.match = $$[QT_INSTALL_LIBS/get]
|
||||
lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
|
||||
lib_replace.CONFIG = path
|
||||
QMAKE_PRL_INSTALL_REPLACE += lib_replace
|
||||
|
@ -3,6 +3,7 @@ SUBDIRS=\
|
||||
qtconcurrentfilter \
|
||||
qtconcurrentiteratekernel \
|
||||
qtconcurrentmap \
|
||||
qtconcurrentmedian \
|
||||
qtconcurrentrun \
|
||||
qtconcurrentthreadengine
|
||||
|
||||
|
@ -0,0 +1,5 @@
|
||||
CONFIG += testcase parallel_test
|
||||
TARGET = tst_qtconcurrentmedian
|
||||
QT = core testlib concurrent
|
||||
SOURCES = tst_qtconcurrentmedian.cpp
|
||||
DEFINES += QT_STRICT_ITERATORS
|
@ -0,0 +1,87 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
#include <qtconcurrentmedian.h>
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
|
||||
class tst_QtConcurrentMedian: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
private slots:
|
||||
void median_data();
|
||||
void median();
|
||||
};
|
||||
|
||||
void tst_QtConcurrentMedian::median_data()
|
||||
{
|
||||
QTest::addColumn<QList<int> >("values");
|
||||
QTest::addColumn<int>("expectedMedian");
|
||||
|
||||
QTest::newRow("size=1")
|
||||
<< (QList<int>() << 1)
|
||||
<< 1;
|
||||
|
||||
QTest::newRow("size=2")
|
||||
<< (QList<int>() << 3 << 2)
|
||||
<< 3;
|
||||
|
||||
QTest::newRow("size=3")
|
||||
<< (QList<int>() << 3 << 1 << 2)
|
||||
<< 2;
|
||||
|
||||
QTest::newRow("gcc bug 58800 (nth_element)")
|
||||
<< (QList<int>() << 207089 << 202585 << 180067 << 157549 << 211592 << 216096 << 207089)
|
||||
<< 207089;
|
||||
}
|
||||
|
||||
void tst_QtConcurrentMedian::median()
|
||||
{
|
||||
QFETCH(QList<int> , values);
|
||||
QFETCH(int, expectedMedian);
|
||||
|
||||
QtConcurrent::Median<int> m(values.size());
|
||||
foreach (int value, values)
|
||||
m.addValue(value);
|
||||
QCOMPARE(m.median(), expectedMedian);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QtConcurrentMedian)
|
||||
#include "tst_qtconcurrentmedian.moc"
|
@ -4221,6 +4221,7 @@ void tst_QGraphicsItem::cursor()
|
||||
QCursor cursor = view.viewport()->cursor();
|
||||
|
||||
{
|
||||
QTest::mouseMove(view.viewport(), QPoint(100, 50));
|
||||
QMouseEvent event(QEvent::MouseMove, QPoint(100, 50), Qt::NoButton, 0, 0);
|
||||
QApplication::sendEvent(view.viewport(), &event);
|
||||
}
|
||||
|
@ -1043,13 +1043,14 @@ void tst_QColumnView::dynamicModelChanges()
|
||||
ColumnView view;
|
||||
view.setModel(&model);
|
||||
view.setItemDelegate(&delegate);
|
||||
centerOnScreen(&view);
|
||||
view.show();
|
||||
|
||||
QStandardItem *item = new QStandardItem(QLatin1String("item"));
|
||||
model.appendRow(item);
|
||||
|
||||
QTest::qWait(200); //let the time for painting to occur
|
||||
QCOMPARE(delegate.paintedIndexes.count(), 1);
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&view)); //let the time for painting to occur
|
||||
QTRY_COMPARE(delegate.paintedIndexes.count(), 1);
|
||||
QCOMPARE(*delegate.paintedIndexes.begin(), model.index(0,0));
|
||||
|
||||
|
||||
|
@ -598,6 +598,7 @@ void tst_QMenu::layoutDirection()
|
||||
centerOnScreen(&win);
|
||||
|
||||
QMenu menu(&win);
|
||||
menu.addAction("foo");
|
||||
menu.move(win.geometry().topRight() + QPoint(50, 0));
|
||||
menu.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&menu));
|
||||
|
Loading…
Reference in New Issue
Block a user