diff options
Diffstat (limited to 'src/widgets/kernel')
24 files changed, 206 insertions, 87 deletions
diff --git a/src/widgets/kernel/qaction.cpp b/src/widgets/kernel/qaction.cpp index 4dd10720d6..95c4877eb9 100644 --- a/src/widgets/kernel/qaction.cpp +++ b/src/widgets/kernel/qaction.cpp @@ -223,8 +223,9 @@ void QActionPrivate::setShortcutEnabled(bool enable, QShortcutMap &map) \snippet mainwindows/application/mainwindow.cpp 19 \codeline - \snippet mainwindows/application/mainwindow.cpp 28 - \snippet mainwindows/application/mainwindow.cpp 31 + \code + fileMenu->addAction(openAct); + \endcode We recommend that actions are created as children of the window they are used in. In most cases actions will be children of diff --git a/src/widgets/kernel/qaction.h b/src/widgets/kernel/qaction.h index 1d69694699..8ef26b60bf 100644 --- a/src/widgets/kernel/qaction.h +++ b/src/widgets/kernel/qaction.h @@ -153,7 +153,7 @@ public: enum ActionEvent { Trigger, Hover }; void activate(ActionEvent event); - bool showStatusText(QWidget *widget=0); + bool showStatusText(QWidget *widget = Q_NULLPTR); void setMenuRole(MenuRole menuRole); MenuRole menuRole() const; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index b9fd6312e7..f82fac836a 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -3250,12 +3250,11 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QPointer<QWidget> pw = w; while (w) { - QMouseEvent me(mouse->type(), relpos, mouse->windowPos(), mouse->globalPos(), mouse->button(), mouse->buttons(), - mouse->modifiers()); + QMouseEvent me(mouse->type(), relpos, mouse->windowPos(), mouse->globalPos(), + mouse->button(), mouse->buttons(), mouse->modifiers(), mouse->source()); me.spont = mouse->spontaneous(); me.setTimestamp(mouse->timestamp()); QGuiApplicationPrivate::setMouseEventFlags(&me, mouse->flags()); - QGuiApplicationPrivate::setMouseEventSource(&me, mouse->source()); // throw away any mouse-tracking-only mouse events if (!w->hasMouseTracking() && mouse->type() == QEvent::MouseMove && mouse->buttons() == 0) { @@ -3689,7 +3688,9 @@ bool QApplication::notify(QObject *receiver, QEvent *e) bool QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e) { // send to all application event filters - if (sendThroughApplicationEventFilters(receiver, e)) + if (threadRequiresCoreApplication() + && receiver->d_func()->threadData->thread == mainThread() + && sendThroughApplicationEventFilters(receiver, e)) return true; if (receiver->isWidgetType()) { diff --git a/src/widgets/kernel/qapplication.h b/src/widgets/kernel/qapplication.h index d4b2326afd..7aaea2a947 100644 --- a/src/widgets/kernel/qapplication.h +++ b/src/widgets/kernel/qapplication.h @@ -104,11 +104,11 @@ public: using QGuiApplication::palette; static QPalette palette(const QWidget *); static QPalette palette(const char *className); - static void setPalette(const QPalette &, const char* className = 0); + static void setPalette(const QPalette &, const char* className = Q_NULLPTR); static QFont font(); static QFont font(const QWidget*); static QFont font(const char *className); - static void setFont(const QFont &, const char* className = 0); + static void setFont(const QFont &, const char* className = Q_NULLPTR); static QFontMetrics fontMetrics(); #if QT_VERSION < 0x060000 // remove these forwarders in Qt 6 diff --git a/src/widgets/kernel/qboxlayout.h b/src/widgets/kernel/qboxlayout.h index 5ce9ca26f6..10209e05c9 100644 --- a/src/widgets/kernel/qboxlayout.h +++ b/src/widgets/kernel/qboxlayout.h @@ -54,7 +54,7 @@ public: enum Direction { LeftToRight, RightToLeft, TopToBottom, BottomToTop, Down = TopToBottom, Up = BottomToTop }; - explicit QBoxLayout(Direction, QWidget *parent = 0); + explicit QBoxLayout(Direction, QWidget *parent = Q_NULLPTR); ~QBoxLayout(); @@ -64,7 +64,7 @@ public: void addSpacing(int size); void addStretch(int stretch = 0); void addSpacerItem(QSpacerItem *spacerItem); - void addWidget(QWidget *, int stretch = 0, Qt::Alignment alignment = 0); + void addWidget(QWidget *, int stretch = 0, Qt::Alignment alignment = Qt::Alignment()); void addLayout(QLayout *layout, int stretch = 0); void addStrut(int); void addItem(QLayoutItem *) Q_DECL_OVERRIDE; @@ -72,7 +72,7 @@ public: void insertSpacing(int index, int size); void insertStretch(int index, int stretch = 0); void insertSpacerItem(int index, QSpacerItem *spacerItem); - void insertWidget(int index, QWidget *widget, int stretch = 0, Qt::Alignment alignment = 0); + void insertWidget(int index, QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment()); void insertLayout(int index, QLayout *layout, int stretch = 0); void insertItem(int index, QLayoutItem *); diff --git a/src/widgets/kernel/qdesktopwidget.h b/src/widgets/kernel/qdesktopwidget.h index 5412c5bc4a..c0cc4f1b81 100644 --- a/src/widgets/kernel/qdesktopwidget.h +++ b/src/widgets/kernel/qdesktopwidget.h @@ -58,7 +58,7 @@ public: int screenCount() const; int primaryScreen() const; - int screenNumber(const QWidget *widget = 0) const; + int screenNumber(const QWidget *widget = Q_NULLPTR) const; int screenNumber(const QPoint &) const; QWidget *screen(int screen = -1); diff --git a/src/widgets/kernel/qformlayout.h b/src/widgets/kernel/qformlayout.h index 18f3c84354..0767d78ce6 100644 --- a/src/widgets/kernel/qformlayout.h +++ b/src/widgets/kernel/qformlayout.h @@ -74,7 +74,7 @@ public: }; Q_ENUM(ItemRole) - explicit QFormLayout(QWidget *parent = 0); + explicit QFormLayout(QWidget *parent = Q_NULLPTR); ~QFormLayout(); void setFieldGrowthPolicy(FieldGrowthPolicy policy); diff --git a/src/widgets/kernel/qgesture.h b/src/widgets/kernel/qgesture.h index dfe9450365..bcf583a507 100644 --- a/src/widgets/kernel/qgesture.h +++ b/src/widgets/kernel/qgesture.h @@ -63,7 +63,7 @@ class Q_WIDGETS_EXPORT QGesture : public QObject Q_PROPERTY(bool hasHotSpot READ hasHotSpot) public: - explicit QGesture(QObject *parent = 0); + explicit QGesture(QObject *parent = Q_NULLPTR); ~QGesture(); Qt::GestureType gestureType() const; @@ -107,7 +107,7 @@ class Q_WIDGETS_EXPORT QPanGesture : public QGesture Q_PRIVATE_PROPERTY(QPanGesture::d_func(), qreal verticalVelocity READ verticalVelocity WRITE setVerticalVelocity) public: - explicit QPanGesture(QObject *parent = 0); + explicit QPanGesture(QObject *parent = Q_NULLPTR); ~QPanGesture(); QPointF lastOffset() const; @@ -154,7 +154,7 @@ public: Q_PROPERTY(QPointF centerPoint READ centerPoint WRITE setCenterPoint) public: - explicit QPinchGesture(QObject *parent = 0); + explicit QPinchGesture(QObject *parent = Q_NULLPTR); ~QPinchGesture(); ChangeFlags totalChangeFlags() const; @@ -210,7 +210,7 @@ public: enum SwipeDirection { NoDirection, Left, Right, Up, Down }; Q_ENUM(SwipeDirection) - explicit QSwipeGesture(QObject *parent = 0); + explicit QSwipeGesture(QObject *parent = Q_NULLPTR); ~QSwipeGesture(); SwipeDirection horizontalDirection() const; @@ -231,7 +231,7 @@ class Q_WIDGETS_EXPORT QTapGesture : public QGesture Q_PROPERTY(QPointF position READ position WRITE setPosition) public: - explicit QTapGesture(QObject *parent = 0); + explicit QTapGesture(QObject *parent = Q_NULLPTR); ~QTapGesture(); QPointF position() const; @@ -249,7 +249,7 @@ class Q_WIDGETS_EXPORT QTapAndHoldGesture : public QGesture Q_PROPERTY(QPointF position READ position WRITE setPosition) public: - explicit QTapAndHoldGesture(QObject *parent = 0); + explicit QTapAndHoldGesture(QObject *parent = Q_NULLPTR); ~QTapAndHoldGesture(); QPointF position() const; diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp index b5d3a56d3f..8cb7c2b560 100644 --- a/src/widgets/kernel/qgesturemanager.cpp +++ b/src/widgets/kernel/qgesturemanager.cpp @@ -569,18 +569,19 @@ void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures, } // for each gesture type - foreach (Qt::GestureType type, gestureByTypes.keys()) { - QHash<QWidget *, QGesture *> gestures = gestureByTypes.value(type); - foreach (QWidget *widget, gestures.keys()) { + for (GestureByTypes::const_iterator git = gestureByTypes.cbegin(), gend = gestureByTypes.cend(); git != gend; ++git) { + const QHash<QWidget *, QGesture *> &gestures = git.value(); + for (QHash<QWidget *, QGesture *>::const_iterator wit = gestures.cbegin(), wend = gestures.cend(); wit != wend; ++wit) { + QWidget *widget = wit.key(); QWidget *w = widget->parentWidget(); while (w) { QMap<Qt::GestureType, Qt::GestureFlags>::const_iterator it - = w->d_func()->gestureContext.constFind(type); + = w->d_func()->gestureContext.constFind(git.key()); if (it != w->d_func()->gestureContext.constEnd()) { // i.e. 'w' listens to gesture 'type' if (!(it.value() & Qt::DontStartGestureOnChildren) && w != widget) { // conflicting gesture! - (*conflicts)[widget].append(gestures[widget]); + (*conflicts)[widget].append(wit.value()); break; } } @@ -591,7 +592,7 @@ void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures, w = w->parentWidget(); } if (!w) - (*normal)[widget].append(gestures[widget]); + (*normal)[widget].append(wit.value()); } } } diff --git a/src/widgets/kernel/qgridlayout.h b/src/widgets/kernel/qgridlayout.h index a582d31634..ae3fe125b6 100644 --- a/src/widgets/kernel/qgridlayout.h +++ b/src/widgets/kernel/qgridlayout.h @@ -93,10 +93,10 @@ public: void invalidate() Q_DECL_OVERRIDE; inline void addWidget(QWidget *w) { QLayout::addWidget(w); } - void addWidget(QWidget *, int row, int column, Qt::Alignment = 0); - void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0); - void addLayout(QLayout *, int row, int column, Qt::Alignment = 0); - void addLayout(QLayout *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0); + void addWidget(QWidget *, int row, int column, Qt::Alignment = Qt::Alignment()); + void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment()); + void addLayout(QLayout *, int row, int column, Qt::Alignment = Qt::Alignment()); + void addLayout(QLayout *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment()); void setOriginCorner(Qt::Corner); Qt::Corner originCorner() const; @@ -107,7 +107,7 @@ public: int count() const Q_DECL_OVERRIDE; void setGeometry(const QRect&) Q_DECL_OVERRIDE; - void addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment = 0); + void addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment = Qt::Alignment()); void setDefaultPositioning(int n, Qt::Orientation orient); void getItemPosition(int idx, int *row, int *column, int *rowSpan, int *columnSpan) const; diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp index d3e5986103..e74f17b6f7 100644 --- a/src/widgets/kernel/qlayout.cpp +++ b/src/widgets/kernel/qlayout.cpp @@ -1175,13 +1175,12 @@ QLayoutItem *QLayout::replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOpt if (index == -1) return 0; + addChildWidget(to); QLayoutItem *newitem = new QWidgetItem(to); newitem->setAlignment(item->alignment()); QLayoutItem *r = d->replaceAt(index, newitem); if (!r) delete newitem; - else - addChildWidget(to); return r; } diff --git a/src/widgets/kernel/qlayoutitem.h b/src/widgets/kernel/qlayoutitem.h index 650e114c76..cdb612728f 100644 --- a/src/widgets/kernel/qlayoutitem.h +++ b/src/widgets/kernel/qlayoutitem.h @@ -53,7 +53,7 @@ class QSize; class Q_WIDGETS_EXPORT QLayoutItem { public: - inline explicit QLayoutItem(Qt::Alignment alignment = 0); + inline explicit QLayoutItem(Qt::Alignment alignment = Qt::Alignment()); virtual ~QLayoutItem(); virtual QSize sizeHint() const = 0; virtual QSize minimumSize() const = 0; diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp index 1ee28f2e9a..b98e8a6a66 100644 --- a/src/widgets/kernel/qopenglwidget.cpp +++ b/src/widgets/kernel/qopenglwidget.cpp @@ -553,7 +553,8 @@ public: hasBeenComposed(false), flushPending(false), paintDevice(0), - updateBehavior(QOpenGLWidget::NoPartialUpdate) + updateBehavior(QOpenGLWidget::NoPartialUpdate), + requestedSamples(0) { requestedFormat = QSurfaceFormat::defaultFormat(); } @@ -595,6 +596,7 @@ public: QOpenGLPaintDevice *paintDevice; QSurfaceFormat requestedFormat; QOpenGLWidget::UpdateBehavior updateBehavior; + int requestedSamples; }; void QOpenGLWidgetPaintDevicePrivate::beginPaint() @@ -686,7 +688,7 @@ void QOpenGLWidgetPrivate::recreateFbo() delete resolvedFbo; resolvedFbo = 0; - int samples = context->format().samples(); + int samples = requestedSamples; QOpenGLExtensions *extfuncs = static_cast<QOpenGLExtensions *>(context->functions()); if (!extfuncs->hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) samples = 0; @@ -695,7 +697,7 @@ void QOpenGLWidgetPrivate::recreateFbo() format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); format.setSamples(samples); - const QSize deviceSize = q->size() * q->devicePixelRatio(); + const QSize deviceSize = q->size() * q->devicePixelRatioF(); fbo = new QOpenGLFramebufferObject(deviceSize, format); if (samples > 0) resolvedFbo = new QOpenGLFramebufferObject(deviceSize); @@ -704,7 +706,7 @@ void QOpenGLWidgetPrivate::recreateFbo() context->functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); paintDevice->setSize(deviceSize); - paintDevice->setDevicePixelRatio(q->devicePixelRatio()); + paintDevice->setDevicePixelRatio(q->devicePixelRatioF()); emit q->resized(); } @@ -742,6 +744,13 @@ void QOpenGLWidgetPrivate::initialize() return; } + // Do not include the sample count. Requesting a multisampled context is not necessary + // since we render into an FBO, never to an actual surface. What's more, attempting to + // create a pbuffer with a multisampled config crashes certain implementations. Just + // avoid the entire hassle, the result is the same. + requestedSamples = requestedFormat.samples(); + requestedFormat.setSamples(0); + QScopedPointer<QOpenGLContext> ctx(new QOpenGLContext); ctx->setShareContext(shareContext); ctx->setFormat(requestedFormat); @@ -778,8 +787,8 @@ void QOpenGLWidgetPrivate::initialize() } paintDevice = new QOpenGLWidgetPaintDevice(q); - paintDevice->setSize(q->size() * q->devicePixelRatio()); - paintDevice->setDevicePixelRatio(q->devicePixelRatio()); + paintDevice->setSize(q->size() * q->devicePixelRatioF()); + paintDevice->setDevicePixelRatio(q->devicePixelRatioF()); context = ctx.take(); initialized = true; @@ -808,7 +817,7 @@ void QOpenGLWidgetPrivate::invokeUserPaint() QOpenGLFunctions *f = ctx->functions(); QOpenGLContextPrivate::get(ctx)->defaultFboRedirect = fbo->handle(); - f->glViewport(0, 0, q->width() * q->devicePixelRatio(), q->height() * q->devicePixelRatio()); + f->glViewport(0, 0, q->width() * q->devicePixelRatioF(), q->height() * q->devicePixelRatioF()); q->paintGL(); flushPending = true; @@ -859,8 +868,8 @@ QImage QOpenGLWidgetPrivate::grabFramebuffer() render(); resolveSamples(); q->makeCurrent(); - QImage res = qt_gl_read_framebuffer(q->size() * q->devicePixelRatio(), false, false); - res.setDevicePixelRatio(q->devicePixelRatio()); + QImage res = qt_gl_read_framebuffer(q->size() * q->devicePixelRatioF(), false, false); + res.setDevicePixelRatio(q->devicePixelRatioF()); return res; } @@ -879,7 +888,7 @@ void QOpenGLWidgetPrivate::resizeViewportFramebuffer() if (!initialized) return; - if (!fbo || q->size() * q->devicePixelRatio() != fbo->size()) + if (!fbo || q->size() * q->devicePixelRatioF() != fbo->size()) recreateFbo(); } @@ -1196,6 +1205,7 @@ int QOpenGLWidget::metric(QPaintDevice::PaintDeviceMetric metric) const return QWidget::metric(metric); QWidget *tlw = window(); + QWindow *window = tlw ? tlw->windowHandle() : 0; QScreen *screen = tlw && tlw->windowHandle() ? tlw->windowHandle()->screen() : 0; if (!screen && QGuiApplication::primaryScreen()) screen = QGuiApplication::primaryScreen(); @@ -1243,8 +1253,13 @@ int QOpenGLWidget::metric(QPaintDevice::PaintDeviceMetric metric) const else return qRound(dpmy * 0.0254); case PdmDevicePixelRatio: - if (screen) - return screen->devicePixelRatio(); + if (window) + return int(window->devicePixelRatio()); + else + return 1.0; + case PdmDevicePixelRatioScaled: + if (window) + return int(window->devicePixelRatio() * devicePixelRatioFScale()); else return 1.0; default: @@ -1304,7 +1319,7 @@ bool QOpenGLWidget::event(QEvent *e) } break; case QEvent::ScreenChangeInternal: - if (d->initialized && d->paintDevice->devicePixelRatio() != devicePixelRatio()) + if (d->initialized && d->paintDevice->devicePixelRatioF() != devicePixelRatioF()) d->recreateFbo(); break; default: diff --git a/src/widgets/kernel/qopenglwidget.h b/src/widgets/kernel/qopenglwidget.h index 4a9edb8180..ca65d75ca8 100644 --- a/src/widgets/kernel/qopenglwidget.h +++ b/src/widgets/kernel/qopenglwidget.h @@ -57,7 +57,7 @@ public: PartialUpdate }; - explicit QOpenGLWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); + explicit QOpenGLWidget(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); ~QOpenGLWidget(); void setUpdateBehavior(UpdateBehavior updateBehavior); diff --git a/src/widgets/kernel/qshortcut.h b/src/widgets/kernel/qshortcut.h index 9171f855ba..e816bbe06d 100644 --- a/src/widgets/kernel/qshortcut.h +++ b/src/widgets/kernel/qshortcut.h @@ -55,7 +55,7 @@ class Q_WIDGETS_EXPORT QShortcut : public QObject public: explicit QShortcut(QWidget *parent); QShortcut(const QKeySequence& key, QWidget *parent, - const char *member = 0, const char *ambiguousMember = 0, + const char *member = Q_NULLPTR, const char *ambiguousMember = Q_NULLPTR, Qt::ShortcutContext context = Qt::WindowShortcut); ~QShortcut(); diff --git a/src/widgets/kernel/qsizepolicy.cpp b/src/widgets/kernel/qsizepolicy.cpp index 1476b4c5d7..3c28f5ccf7 100644 --- a/src/widgets/kernel/qsizepolicy.cpp +++ b/src/widgets/kernel/qsizepolicy.cpp @@ -332,6 +332,15 @@ void QSizePolicy::setControlType(ControlType type) */ /*! + \fn uint qHash(QSizePolicy key, uint seed = 0) + \since 5.6 + \relates QSizePolicy + + Returns the hash value for \a key, using + \a seed to seed the calculation. +*/ + +/*! \fn int QSizePolicy::horizontalStretch() const Returns the horizontal stretch factor of the size policy. diff --git a/src/widgets/kernel/qsizepolicy.h b/src/widgets/kernel/qsizepolicy.h index 6cd511f513..7c9a356973 100644 --- a/src/widgets/kernel/qsizepolicy.h +++ b/src/widgets/kernel/qsizepolicy.h @@ -40,6 +40,9 @@ QT_BEGIN_NAMESPACE class QVariant; +class QSizePolicy; + +Q_DECL_CONST_FUNCTION inline uint qHash(QSizePolicy key, uint seed = 0) Q_DECL_NOTHROW; class Q_WIDGETS_EXPORT QSizePolicy { @@ -112,6 +115,9 @@ public: bool operator==(const QSizePolicy& s) const { return data == s.data; } bool operator!=(const QSizePolicy& s) const { return data != s.data; } + + friend Q_DECL_CONST_FUNCTION uint qHash(QSizePolicy key, uint seed) Q_DECL_NOTHROW { return qHash(key.data, seed); } + operator QVariant() const; int horizontalStretch() const { return static_cast<int>(bits.horStretch); } diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp index 8a800ab9d0..51bf6e4684 100644 --- a/src/widgets/kernel/qtooltip.cpp +++ b/src/widgets/kernel/qtooltip.cpp @@ -37,7 +37,6 @@ #include <qapplication.h> #include <qdesktopwidget.h> #include <qevent.h> -#include <qhash.h> #include <qlabel.h> #include <qpointer.h> #include <qstyle.h> diff --git a/src/widgets/kernel/qtooltip.h b/src/widgets/kernel/qtooltip.h index 286d8fb327..54cf71d2f0 100644 --- a/src/widgets/kernel/qtooltip.h +++ b/src/widgets/kernel/qtooltip.h @@ -46,7 +46,7 @@ class Q_WIDGETS_EXPORT QToolTip QToolTip() Q_DECL_EQ_DELETE; public: // ### Qt 6 - merge the three showText functions below - static void showText(const QPoint &pos, const QString &text, QWidget *w = 0); + static void showText(const QPoint &pos, const QString &text, QWidget *w = Q_NULLPTR); static void showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect); static void showText(const QPoint &pos, const QString &text, QWidget *w, const QRect &rect, int msecShowTime); static inline void hideText() { showText(QPoint(), QString()); } diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp index 5fb4695687..1e437c4fb7 100644 --- a/src/widgets/kernel/qwhatsthis.cpp +++ b/src/widgets/kernel/qwhatsthis.cpp @@ -42,7 +42,6 @@ #include "qscreen.h" #include "qpainter.h" #include "qtimer.h" -#include "qhash.h" #include "qaction.h" #include "qcursor.h" #include "qbitmap.h" diff --git a/src/widgets/kernel/qwhatsthis.h b/src/widgets/kernel/qwhatsthis.h index 999c66486c..367b8aab3c 100644 --- a/src/widgets/kernel/qwhatsthis.h +++ b/src/widgets/kernel/qwhatsthis.h @@ -53,10 +53,10 @@ public: static bool inWhatsThisMode(); static void leaveWhatsThisMode(); - static void showText(const QPoint &pos, const QString &text, QWidget *w = 0); + static void showText(const QPoint &pos, const QString &text, QWidget *w = Q_NULLPTR); static void hideText(); - static QAction *createAction(QObject *parent = 0); + static QAction *createAction(QObject *parent = Q_NULLPTR); }; diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index dbb229484b..1ebf782edf 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -37,7 +37,6 @@ #include "qcursor.h" #include "qdesktopwidget_p.h" #include "qevent.h" -#include "qhash.h" #include "qlayout.h" #include "qmenu.h" #include "qmetaobject.h" @@ -69,6 +68,7 @@ #include "private/qstylesheetstyle_p.h" #include "private/qstyle_p.h" #include "qfileinfo.h" +#include <QtGui/private/qhighdpiscaling_p.h> #include <QtGui/qinputmethod.h> #include <QtGui/qopenglcontext.h> #include <QtGui/private/qopenglcontext_p.h> @@ -100,6 +100,7 @@ #include "qwindowcontainer_p.h" +#include <QtPlatformHeaders/qxcbwindowfunctions.h> // widget/widget data creation count //#define QWIDGET_EXTRA_DEBUG @@ -711,7 +712,7 @@ void QWidget::setAutoFillBackground(bool enabled) close(). \row \li Top-level windows \li - \l windowModified, \l windowTitle, \l windowIcon, \l windowIconText, + \l windowModified, \l windowTitle, \l windowIcon, \l isActiveWindow, activateWindow(), \l minimized, showMinimized(), \l maximized, showMaximized(), \l fullScreen, showFullScreen(), showNormal(). @@ -2035,7 +2036,7 @@ void QWidgetPrivate::setSystemClip(QPaintDevice *paintDevice, const QRegion ® // Transform the system clip region from device-independent pixels to device pixels QPaintEngine *paintEngine = paintDevice->paintEngine(); QTransform scaleTransform; - const qreal devicePixelRatio = paintDevice->devicePixelRatio(); + const qreal devicePixelRatio = paintDevice->devicePixelRatioF(); scaleTransform.scale(devicePixelRatio, devicePixelRatio); paintEngine->d_func()->systemClip = scaleTransform.map(region); } @@ -5361,7 +5362,7 @@ void QWidgetPrivate::render_helper(QPainter *painter, const QPoint &targetOffset if (size.isNull()) return; - const qreal pixmapDevicePixelRatio = qreal(painter->device()->devicePixelRatio()); + const qreal pixmapDevicePixelRatio = painter->device()->devicePixelRatioF(); QPixmap pixmap(size * pixmapDevicePixelRatio); pixmap.setDevicePixelRatio(pixmapDevicePixelRatio); @@ -5946,7 +5947,7 @@ void QWidget::unsetLocale() window title, if set. This is done by the QPA plugin, so it is shown to the user, but isn't part of the windowTitle string. - \sa windowIcon, windowIconText, windowModified, windowFilePath + \sa windowIcon, windowModified, windowFilePath */ QString QWidget::windowTitle() const { @@ -6041,7 +6042,11 @@ void QWidgetPrivate::setWindowIconText_helper(const QString &title) void QWidgetPrivate::setWindowIconText_sys(const QString &iconText) { - Q_UNUSED(iconText); + Q_Q(QWidget); + // ### The QWidget property is deprecated, but the XCB window function is not. + // It should remain available for the rare application that needs it. + if (QWindow *window = q->windowHandle()) + QXcbWindowFunctions::setWmWindowIconText(window, iconText); } /*! @@ -6051,6 +6056,9 @@ void QWidgetPrivate::setWindowIconText_sys(const QString &iconText) new \a iconText as an argument. \since 5.2 + \obsolete + + This signal is deprecated. */ void QWidget::setWindowIconText(const QString &iconText) @@ -6101,7 +6109,7 @@ void QWidget::setWindowTitle(const QString &title) has been set, windowIcon() returns the application icon (QApplication::windowIcon()). - \sa windowIconText, windowTitle + \sa windowTitle */ QIcon QWidget::windowIcon() const { @@ -6117,8 +6125,15 @@ QIcon QWidget::windowIcon() const void QWidgetPrivate::setWindowIcon_helper() { + Q_Q(QWidget); QEvent e(QEvent::WindowIconChange); - QApplication::sendEvent(q_func(), &e); + + // Do not send the event if the widget is a top level. + // In that case, setWindowIcon_sys does it, and event propagation from + // QWidgetWindow to the top level QWidget ensures that the event reaches + // the top level anyhow + if (!q->windowHandle()) + QApplication::sendEvent(q, &e); for (int i = 0; i < children.size(); ++i) { QWidget *w = qobject_cast<QWidget *>(children.at(i)); if (w && !w->isWindow()) @@ -6161,10 +6176,15 @@ void QWidgetPrivate::setWindowIcon_sys() /*! \property QWidget::windowIconText - \brief the widget's icon text + \brief the text to be displayed on the icon of a minimized window This property only makes sense for windows. If no icon - text has been set, this functions returns an empty string. + text has been set, this accessor returns an empty string. + It is only implemented on the X11 platform, and only certain + window managers use this window property. + + \obsolete + This property is deprecated. \sa windowIcon, windowTitle */ @@ -9718,6 +9738,8 @@ void QWidget::setInputMethodHints(Qt::InputMethodHints hints) d->imHints = hints; if (this == QGuiApplication::focusObject()) QGuiApplication::inputMethod()->update(Qt::ImHints); +#else + Q_UNUSED(hints); #endif //QT_NO_IM } @@ -11812,13 +11834,11 @@ void QWidgetPrivate::updateFrameStrut() Q_Q(QWidget); if (q->data->fstrut_dirty) { if (QTLWExtra *te = maybeTopData()) { - if (te->window) { - if (const QPlatformWindow *pw = te->window->handle()) { - const QMargins margins = pw->frameMargins(); - if (!margins.isNull()) { - te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom()); - q->data->fstrut_dirty = false; - } + if (te->window && te->window->handle()) { + const QMargins margins = te->window->frameMargins(); + if (!margins.isNull()) { + te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom()); + q->data->fstrut_dirty = false; } } } @@ -12637,6 +12657,9 @@ int QWidget::metric(PaintDeviceMetric m) const return qRound(screen->physicalDotsPerInchY()); } else if (m == PdmDevicePixelRatio) { return topLevelWindow ? topLevelWindow->devicePixelRatio() : qApp->devicePixelRatio(); + } else if (m == PdmDevicePixelRatioScaled) { + return (QPaintDevice::devicePixelRatioFScale() * + (topLevelWindow ? topLevelWindow->devicePixelRatio() : qApp->devicePixelRatio())); } else { val = QPaintDevice::metric(m);// XXX } @@ -12762,7 +12785,7 @@ void QWidgetPrivate::setMask_sys(const QRegion ®ion) Q_Q(QWidget); if (const QWindow *window = q->windowHandle()) if (QPlatformWindow *platformWindow = window->handle()) - platformWindow->setMask(region); + platformWindow->setMask(QHighDpi::toNativeLocalRegion(region, window)); } /*! @@ -12815,6 +12838,65 @@ void QWidgetPrivate::setWidgetParentHelper(QObject *widgetAsObject, QObject *new widget->setParent(static_cast<QWidget*>(newParent)); } +#ifndef QT_NO_DEBUG_STREAM + +static inline void formatWidgetAttributes(QDebug debug, const QWidget *widget) +{ + const QMetaObject *qtMo = qt_getEnumMetaObject(Qt::WA_AttributeCount); + const QMetaEnum me = qtMo->enumerator(qtMo->indexOfEnumerator("WidgetAttribute")); + debug << ", attributes=["; + int count = 0; + for (int a = 0; a < Qt::WA_AttributeCount; ++a) { + if (widget->testAttribute(static_cast<Qt::WidgetAttribute>(a))) { + if (count++) + debug << ','; + debug << me.valueToKey(a); + } + } + debug << ']'; +} + +QDebug operator<<(QDebug debug, const QWidget *widget) +{ + const QDebugStateSaver saver(debug); + debug.nospace(); + if (widget) { + debug << widget->metaObject()->className() << '(' << (void *)widget; + if (!widget->objectName().isEmpty()) + debug << ", name=" << widget->objectName(); + if (debug.verbosity() > 2) { + const QRect geometry = widget->geometry(); + const QRect frameGeometry = widget->frameGeometry(); + if (widget->isVisible()) + debug << ", visible"; + if (!widget->isEnabled()) + debug << ", disabled"; + debug << ", states=" << widget->windowState() + << ", type=" << widget->windowType() << ", flags=" << widget->windowFlags(); + formatWidgetAttributes(debug, widget); + if (widget->isWindow()) + debug << ", window"; + debug << ", " << geometry.width() << 'x' << geometry.height() + << forcesign << geometry.x() << geometry.y() << noforcesign; + if (frameGeometry != geometry) { + const QMargins margins(geometry.x() - frameGeometry.x(), + geometry.y() - frameGeometry.y(), + frameGeometry.right() - geometry.right(), + frameGeometry.bottom() - geometry.bottom()); + debug << ", margins=" << margins; + } + debug << ", devicePixelRatio=" << widget->devicePixelRatioF(); + if (const WId wid = widget->internalWinId()) + debug << ", winId=0x" << hex << wid << dec; + } + debug << ')'; + } else { + debug << "QWidget(0x0)"; + } + return debug; +} +#endif // !QT_NO_DEBUG_STREAM + /*! \fn Qt::HANDLE QWidget::macCGHandle() const \internal diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index c3913e9d45..a56f6e1133 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -89,6 +89,9 @@ class QGraphicsEffect; class QRasterWindowSurface; class QUnifiedToolbarSurface; class QPixmap; +#ifndef QT_NO_DEBUG_STREAM +class QDebug; +#endif class QWidgetData { @@ -165,7 +168,7 @@ class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice Q_PROPERTY(bool acceptDrops READ acceptDrops WRITE setAcceptDrops) Q_PROPERTY(QString windowTitle READ windowTitle WRITE setWindowTitle NOTIFY windowTitleChanged DESIGNABLE isWindow) Q_PROPERTY(QIcon windowIcon READ windowIcon WRITE setWindowIcon NOTIFY windowIconChanged DESIGNABLE isWindow) - Q_PROPERTY(QString windowIconText READ windowIconText WRITE setWindowIconText NOTIFY windowIconTextChanged DESIGNABLE isWindow) + Q_PROPERTY(QString windowIconText READ windowIconText WRITE setWindowIconText NOTIFY windowIconTextChanged DESIGNABLE isWindow) // deprecated Q_PROPERTY(double windowOpacity READ windowOpacity WRITE setWindowOpacity DESIGNABLE isWindow) Q_PROPERTY(bool windowModified READ isWindowModified WRITE setWindowModified DESIGNABLE isWindow) #ifndef QT_NO_TOOLTIP @@ -200,7 +203,7 @@ public: }; Q_DECLARE_FLAGS(RenderFlags, RenderFlag) - explicit QWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); + explicit QWidget(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); ~QWidget(); int devType() const Q_DECL_OVERRIDE; @@ -590,7 +593,7 @@ public: QWindow *windowHandle() const; - static QWidget *createWindowContainer(QWindow *window, QWidget *parent=0, Qt::WindowFlags flags=0); + static QWidget *createWindowContainer(QWindow *window, QWidget *parent=Q_NULLPTR, Qt::WindowFlags flags=Qt::WindowFlags()); friend class QDesktopScreenWidget; @@ -731,12 +734,12 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QWidget::RenderFlags) #ifndef Q_QDOC template <> inline QWidget *qobject_cast<QWidget*>(QObject *o) { - if (!o || !o->isWidgetType()) return 0; + if (!o || !o->isWidgetType()) return Q_NULLPTR; return static_cast<QWidget*>(o); } template <> inline const QWidget *qobject_cast<const QWidget*>(const QObject *o) { - if (!o || !o->isWidgetType()) return 0; + if (!o || !o->isWidgetType()) return Q_NULLPTR; return static_cast<const QWidget*>(o); } #endif // !Q_QDOC @@ -858,6 +861,10 @@ inline bool QWidget::testAttribute(Qt::WidgetAttribute attribute) const #define QWIDGETSIZE_MAX ((1<<24)-1) +#ifndef QT_NO_DEBUG_STREAM +Q_WIDGETS_EXPORT QDebug operator<<(QDebug, const QWidget *); +#endif + QT_END_NAMESPACE #endif // QWIDGET_H diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index d4e73bcac4..58436a7d92 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -45,13 +45,13 @@ #include <qpa/qplatformtheme.h> #include <qpa/qplatformwindow.h> #include <private/qgesturemanager_p.h> +#include <private/qhighdpiscaling_p.h> QT_BEGIN_NAMESPACE Q_WIDGETS_EXPORT extern bool qt_tab_all_widgets(); QWidget *qt_button_down = 0; // widget got last button-down -static QPointer<QWidget> qt_tablet_target = 0; // popup control QWidget *qt_popup_down = 0; // popup that contains the pressed widget @@ -161,7 +161,7 @@ bool QWidgetWindow::event(QEvent *event) if (m_widget->testAttribute(Qt::WA_DontShowOnScreen)) { // \a event is uninteresting for QWidgetWindow, the event was probably // generated before WA_DontShowOnScreen was set - return m_widget->event(event); + return QCoreApplication::sendEvent(m_widget, event); } switch (event->type()) { @@ -303,7 +303,7 @@ bool QWidgetWindow::event(QEvent *event) break; } - if (m_widget->event(event) && event->type() != QEvent::Timer) + if (QCoreApplication::sendEvent(m_widget, event) && event->type() != QEvent::Timer) return true; return QWindow::event(event); @@ -446,8 +446,8 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) if (receiver != popup) widgetPos = receiver->mapFromGlobal(event->globalPos()); QWidget *alien = m_widget->childAt(m_widget->mapFromGlobal(event->globalPos())); - QMouseEvent e(event->type(), widgetPos, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); - QGuiApplicationPrivate::setMouseEventSource(&e, QGuiApplicationPrivate::mouseEventSource(event)); + QMouseEvent e(event->type(), widgetPos, event->windowPos(), event->screenPos(), + event->button(), event->buttons(), event->modifiers(), event->source()); e.setTimestamp(event->timestamp()); QApplicationPrivate::sendMouseEvent(receiver, &e, alien, m_widget, &qt_button_down, qt_last_mouse_receiver); qt_last_mouse_receiver = receiver; @@ -489,9 +489,9 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) if (globalGeometry.contains(event->globalPos())) { // Use postEvent() to ensure the local QEventLoop terminates when called from QMenu::exec() const QPoint localPos = win->mapFromGlobal(event->globalPos()); - QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPos(), event->button(), event->buttons(), event->modifiers()); + QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPos(), + event->button(), event->buttons(), event->modifiers(), event->source()); QCoreApplicationPrivate::setEventSpontaneous(e, true); - QGuiApplicationPrivate::setMouseEventSource(e, QGuiApplicationPrivate::mouseEventSource(event)); e->setTimestamp(event->timestamp()); QCoreApplication::postEvent(win, e); } @@ -548,8 +548,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) // The preceding statement excludes MouseButtonPress events which caused // creation of a MouseButtonDblClick event. QTBUG-25831 QMouseEvent translated(event->type(), mapped, event->windowPos(), event->screenPos(), - event->button(), event->buttons(), event->modifiers()); - QGuiApplicationPrivate::setMouseEventSource(&translated, QGuiApplicationPrivate::mouseEventSource(event)); + event->button(), event->buttons(), event->modifiers(), event->source()); translated.setTimestamp(event->timestamp()); QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget, &qt_button_down, qt_last_mouse_receiver); @@ -673,7 +672,7 @@ void QWidgetWindow::updateNormalGeometry() // Ask platform window, default to widget geometry. QRect normalGeometry; if (const QPlatformWindow *pw = handle()) - normalGeometry = pw->normalGeometry(); + normalGeometry = QHighDpi::fromNativePixels(pw->normalGeometry(), this); if (!normalGeometry.isValid() && effectiveState(m_widget->windowState()) == Qt::WindowNoState) normalGeometry = m_widget->geometry(); if (normalGeometry.isValid()) @@ -874,6 +873,7 @@ bool QWidgetWindow::nativeEvent(const QByteArray &eventType, void *message, long #ifndef QT_NO_TABLETEVENT void QWidgetWindow::handleTabletEvent(QTabletEvent *event) { + static QPointer<QWidget> qt_tablet_target = 0; if (event->type() == QEvent::TabletPress) { QWidget *widget = m_widget->childAt(event->pos()); if (!widget) |