diff options
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc | 5 | ||||
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 6 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p.h | 15 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 16 | ||||
-rw-r--r-- | src/quick/items/qquickmousearea.cpp | 6 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffect.cpp | 1 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffectnode.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 8 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 17 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgcontext.cpp | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 8 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/shaders/distancefieldshiftedtext.frag | 2 | ||||
-rw-r--r-- | src/quick/util/qquicksmoothedanimation.cpp | 3 | ||||
-rw-r--r-- | src/quick/util/qquickvaluetypes_p.h | 82 |
16 files changed, 116 insertions, 66 deletions
diff --git a/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc b/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc index 384e8209c1..16075f0db3 100644 --- a/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc +++ b/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc @@ -724,6 +724,11 @@ with multiple windows. \li Some material flags prevent batching, the most limiting one being QSGMaterial::RequiresFullMatrix which prevents all batching. + \li Applications with a monochrome background should set it using + QQuickWindow::setColor() rather than using a top-level Rectangle item. + QQuickWindow::setColor() will be used in a call to \c glClear(), + which is potentially faster. + \endlist If an application performs poorly, make sure that rendering is diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index f0a68b184a..ae174d86e0 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -1116,10 +1116,10 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) hData.velocity = 0; } - if ((hMoved && !prevHMoved) || (vMoved && !prevVMoved)) { - draggingStarting(); + draggingStarting(); + + if ((hMoved && !prevHMoved) || (vMoved && !prevVMoved)) q->movementStarting(); - } qint64 currentTimestamp = computeCurrentTime(event); qreal elapsed = qreal(currentTimestamp - (lastPos.isNull() ? lastPressTime : lastPosTime)) / 1000.; diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 513f8f3857..d9ff024d9f 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1118,11 +1118,13 @@ void QQuickItemViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF & if (header && header->item == item) { updateHeader(); markExtentsDirty(); + updateViewport(); if (!q->isMoving() && !q->isFlicking()) fixupPosition(); } else if (footer && footer->item == item) { updateFooter(); markExtentsDirty(); + updateViewport(); if (!q->isMoving() && !q->isFlicking()) fixupPosition(); } diff --git a/src/quick/items/qquickitemview_p.h b/src/quick/items/qquickitemview_p.h index 318f5361b5..17d150f480 100644 --- a/src/quick/items/qquickitemview_p.h +++ b/src/quick/items/qquickitemview_p.h @@ -324,6 +324,21 @@ public: } } + void setSections(const QString &prev, const QString §, const QString &next) { + bool prevChanged = prev != m_prevSection; + bool sectChanged = sect != m_section; + bool nextChanged = next != m_nextSection; + m_prevSection = prev; + m_section = sect; + m_nextSection = next; + if (prevChanged) + Q_EMIT prevSectionChanged(); + if (sectChanged) + Q_EMIT sectionChanged(); + if (nextChanged) + Q_EMIT nextSectionChanged(); + } + void emitAdd() { Q_EMIT add(); } void emitRemove() { Q_EMIT remove(); } diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index c55f9ef696..d6754ddfd1 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -487,7 +487,7 @@ QString QQuickListViewPrivate::sectionAt(int modelIndex) return item->attached->section(); QString section; - if (sectionCriteria) { + if (sectionCriteria && modelIndex >= 0 && modelIndex < itemCount) { QString propValue = model->stringValue(modelIndex, sectionCriteria->property()); section = sectionCriteria->sectionString(propValue); } @@ -565,19 +565,19 @@ FxViewItem *QQuickListViewPrivate::newViewItem(int modelIndex, QQuickItem *item) // initialise attached properties if (sectionCriteria) { QString propValue = model->stringValue(modelIndex, sectionCriteria->property()); - listItem->attached->setSection(sectionCriteria->sectionString(propValue)); + QString section = sectionCriteria->sectionString(propValue); + QString prevSection; + QString nextSection; if (modelIndex > 0) { if (FxViewItem *item = itemBefore(modelIndex)) - listItem->attached->setPrevSection(item->attached->section()); + prevSection = item->attached->section(); else - listItem->attached->setPrevSection(sectionAt(modelIndex-1)); + prevSection = sectionAt(modelIndex-1); } if (modelIndex < model->count()-1) { - if (FxViewItem *item = visibleItem(modelIndex+1)) - listItem->attached->setNextSection(static_cast<QQuickListViewAttached*>(item->attached)->section()); - else - listItem->attached->setNextSection(sectionAt(modelIndex+1)); + nextSection = sectionAt(modelIndex+1); } + listItem->attached->setSections(prevSection, section, nextSection); } return listItem; diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index ca64ebb6e3..2467d7252a 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -823,6 +823,12 @@ void QQuickMouseArea::ungrabMouse() d->pressed = 0; d->stealMouse = false; setKeepMouseGrab(false); + +#ifndef QT_NO_DRAGANDDROP + if (d->drag) + d->drag->setActive(false); +#endif + emit canceled(); emit pressedChanged(); emit pressedButtonsChanged(); diff --git a/src/quick/items/qquickshadereffect.cpp b/src/quick/items/qquickshadereffect.cpp index 9c766a1622..9a20703f18 100644 --- a/src/quick/items/qquickshadereffect.cpp +++ b/src/quick/items/qquickshadereffect.cpp @@ -559,6 +559,7 @@ void QQuickShaderEffectCommon::propertyChanged(QQuickItem *item, int mappedId, \li QVector4D -> vec4 \li QTransform -> mat3 \li QMatrix4x4 -> mat4 + \li QQuaternion -> vec4, scalar value is \c w. \li \l Image, \l ShaderEffectSource -> sampler2D - Origin is in the top-left corner, and the color values are premultiplied. \endlist diff --git a/src/quick/items/qquickshadereffectnode.cpp b/src/quick/items/qquickshadereffectnode.cpp index 8788fa8362..a615cb6f91 100644 --- a/src/quick/items/qquickshadereffectnode.cpp +++ b/src/quick/items/qquickshadereffectnode.cpp @@ -146,7 +146,6 @@ void QQuickCustomMaterialShader::updateState(const RenderState &state, QSGMateri continue; } } - qWarning("ShaderEffect: source or provider missing when binding textures"); glBindTexture(GL_TEXTURE_2D, 0); } else if (d.specialType == UniformData::Opacity) { program()->setUniformValue(loc, state.opacity()); @@ -197,6 +196,12 @@ void QQuickCustomMaterialShader::updateState(const RenderState &state, QSGMateri case QMetaType::QVector4D: program()->setUniformValue(loc, qvariant_cast<QVector4D>(d.value)); break; + case QMetaType::QQuaternion: + { + QQuaternion q = qvariant_cast<QQuaternion>(d.value); + program()->setUniformValue(loc, q.x(), q.y(), q.z(), q.scalar()); + } + break; case QMetaType::QMatrix4x4: program()->setUniformValue(loc, qvariant_cast<QMatrix4x4>(d.value)); break; diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index b46387ba47..1dd1dfa57e 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1679,6 +1679,7 @@ bool QQuickTextInput::event(QEvent* ev) || ke == QKeySequence::SelectAll || ke == QKeySequence::SelectEndOfDocument) { ke->accept(); + return true; } else if (ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier || ke->modifiers() == Qt::KeypadModifier) { if (ke->key() < Qt::Key_Escape) { @@ -1692,6 +1693,7 @@ bool QQuickTextInput::event(QEvent* ev) case Qt::Key_Backspace: case Qt::Key_Left: case Qt::Key_Right: + ke->accept(); return true; default: break; @@ -2533,7 +2535,7 @@ void QQuickTextInputPrivate::handleFocusEvent(QFocusEvent *event) && !persistentSelection) deselect(); - if (hasAcceptableInput(m_text) || fixup()) + if (q->hasAcceptableInput() || fixup()) emit q->editingFinished(); #ifndef QT_NO_IM @@ -3392,7 +3394,6 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo */ void QQuickTextInputPrivate::internalSetText(const QString &txt, int pos, bool edited) { - Q_Q(QQuickTextInput); internalDeselect(); QString oldText = m_text; if (m_maskData) { @@ -3410,6 +3411,7 @@ void QQuickTextInputPrivate::internalSetText(const QString &txt, int pos, bool e #ifdef QT_NO_ACCESSIBILITY Q_UNUSED(changed) #else + Q_Q(QQuickTextInput); if (changed && QAccessible::isActive()) { if (QObject *acc = QQuickAccessibleAttached::findAccessible(q, QAccessible::EditableText)) { QAccessibleTextUpdateEvent ev(acc, 0, oldText, m_text); @@ -4117,7 +4119,7 @@ void QQuickTextInputPrivate::processKeyEvent(QKeyEvent* event) Q_Q(QQuickTextInput); if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { - if (hasAcceptableInput(m_text) || fixup()) { + if (q->hasAcceptableInput() || fixup()) { emit q->accepted(); emit q->editingFinished(); } diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 848eeca2a6..3a8e177bbb 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -665,14 +665,18 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q QVarLengthArray<QQuickItem *, 20> changed; // Does this change the active focus? - if (item == contentItem || (scopePrivate->activeFocus && item->isEnabled())) { + if (item == contentItem || scopePrivate->activeFocus) { QQuickItem *oldActiveFocusItem = 0; oldActiveFocusItem = activeFocusItem; - newActiveFocusItem = item; - while (newActiveFocusItem->isFocusScope() - && newActiveFocusItem->scopedFocusItem() - && newActiveFocusItem->scopedFocusItem()->isEnabled()) { - newActiveFocusItem = newActiveFocusItem->scopedFocusItem(); + if (item->isEnabled()) { + newActiveFocusItem = item; + while (newActiveFocusItem->isFocusScope() + && newActiveFocusItem->scopedFocusItem() + && newActiveFocusItem->scopedFocusItem()->isEnabled()) { + newActiveFocusItem = newActiveFocusItem->scopedFocusItem(); + } + } else { + newActiveFocusItem = scope; } if (oldActiveFocusItem) { @@ -2795,6 +2799,7 @@ QImage QQuickWindow::grabWindow() QOpenGLContext context; context.setFormat(requestedFormat()); + context.setShareContext(QSGContext::sharedOpenGLContext()); context.create(); context.makeCurrent(this); d->context->initialize(&context); diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp index afde7939f2..90803db9fe 100644 --- a/src/quick/scenegraph/qsgcontext.cpp +++ b/src/quick/scenegraph/qsgcontext.cpp @@ -454,6 +454,8 @@ void QSGRenderContext::initialize(QOpenGLContext *context) const char *renderer = (const char *) glGetString(GL_RENDERER); if (strstr(renderer, "llvmpipe")) m_serializedRender = true; + if (strstr(vendor, "Hisilicon Technologies") && strstr(renderer, "Immersion.16")) + m_brokenIBOs = true; #endif emit initialized(); diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index aa0d7b5a6c..52df55fa92 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -122,6 +122,7 @@ public: QSGRenderContext *rc; QImage grabContent; + int m_update_timer; bool eventPending; }; @@ -384,7 +385,8 @@ void QSGGuiThreadRenderLoop::maybeUpdate(QQuickWindow *window) m_windows[window].updatePending = true; if (!eventPending) { - QCoreApplication::postEvent(this, new QEvent(QEvent::User)); + const int exhaust_delay = 5; + m_update_timer = startTimer(exhaust_delay, Qt::PreciseTimer); eventPending = true; } } @@ -399,8 +401,10 @@ QSGContext *QSGGuiThreadRenderLoop::sceneGraphContext() const bool QSGGuiThreadRenderLoop::event(QEvent *e) { - if (e->type() == QEvent::User) { + if (e->type() == QEvent::Timer) { eventPending = false; + killTimer(m_update_timer); + m_update_timer = 0; for (QHash<QQuickWindow *, WindowData>::const_iterator it = m_windows.constBegin(); it != m_windows.constEnd(); ++it) { const WindowData &data = it.value(); diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index acd07cf6cd..2759d82e77 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -690,7 +690,7 @@ QSGThreadedRenderLoop::QSGThreadedRenderLoop() : sg(QSGContext::createDefaultContext()) , m_animation_timer(0) { -#if defined(QSG_RENDER_LOOP_DEBUG_BASIC) || defined (QSG_RENDER_LOOP_DEBUG_FULL) +#if defined(QSG_RENDER_LOOP_DEBUG) qsgrl_timer.start(); #endif diff --git a/src/quick/scenegraph/shaders/distancefieldshiftedtext.frag b/src/quick/scenegraph/shaders/distancefieldshiftedtext.frag index 60c1c7468b..42fead8713 100644 --- a/src/quick/scenegraph/shaders/distancefieldshiftedtext.frag +++ b/src/quick/scenegraph/shaders/distancefieldshiftedtext.frag @@ -1,7 +1,7 @@ varying highp vec2 sampleCoord; varying highp vec2 shiftedSampleCoord; -uniform sampler2D _qt_texture; +uniform mediump sampler2D _qt_texture; uniform lowp vec4 color; uniform lowp vec4 styleColor; uniform mediump float alphaMin; diff --git a/src/quick/util/qquicksmoothedanimation.cpp b/src/quick/util/qquicksmoothedanimation.cpp index 017fe39003..9e9e6cb419 100644 --- a/src/quick/util/qquicksmoothedanimation.cpp +++ b/src/quick/util/qquicksmoothedanimation.cpp @@ -242,6 +242,9 @@ qreal QSmoothedAnimation::easeFollow(qreal time_seconds) void QSmoothedAnimation::updateCurrentTime(int t) { + if (!isRunning() && !isPaused()) // This can happen if init() stops the animation in some cases + return; + qreal time_seconds = useDelta ? qreal(QQmlAnimationTimer::instance()->currentDelta()) / 1000. : qreal(t - lastTime) / 1000.; if (useDelta) useDelta = false; diff --git a/src/quick/util/qquickvaluetypes_p.h b/src/quick/util/qquickvaluetypes_p.h index 88570f3b6e..94db7a8729 100644 --- a/src/quick/util/qquickvaluetypes_p.h +++ b/src/quick/util/qquickvaluetypes_p.h @@ -64,10 +64,10 @@ void registerValueTypes(); class Q_AUTOTEST_EXPORT QQuickColorValueType : public QQmlValueTypeBase<QColor> { - Q_PROPERTY(qreal r READ r WRITE setR) - Q_PROPERTY(qreal g READ g WRITE setG) - Q_PROPERTY(qreal b READ b WRITE setB) - Q_PROPERTY(qreal a READ a WRITE setA) + Q_PROPERTY(qreal r READ r WRITE setR FINAL) + Q_PROPERTY(qreal g READ g WRITE setG FINAL) + Q_PROPERTY(qreal b READ b WRITE setB FINAL) + Q_PROPERTY(qreal a READ a WRITE setA FINAL) Q_OBJECT public: QQuickColorValueType(QObject *parent = 0); @@ -86,8 +86,8 @@ public: class Q_AUTOTEST_EXPORT QQuickVector2DValueType : public QQmlValueTypeBase<QVector2D> { - Q_PROPERTY(qreal x READ x WRITE setX) - Q_PROPERTY(qreal y READ y WRITE setY) + Q_PROPERTY(qreal x READ x WRITE setX FINAL) + Q_PROPERTY(qreal y READ y WRITE setY FINAL) Q_OBJECT public: QQuickVector2DValueType(QObject *parent = 0); @@ -115,9 +115,9 @@ public: class Q_AUTOTEST_EXPORT QQuickVector3DValueType : public QQmlValueTypeBase<QVector3D> { - Q_PROPERTY(qreal x READ x WRITE setX) - Q_PROPERTY(qreal y READ y WRITE setY) - Q_PROPERTY(qreal z READ z WRITE setZ) + Q_PROPERTY(qreal x READ x WRITE setX FINAL) + Q_PROPERTY(qreal y READ y WRITE setY FINAL) + Q_PROPERTY(qreal z READ z WRITE setZ FINAL) Q_OBJECT public: QQuickVector3DValueType(QObject *parent = 0); @@ -149,10 +149,10 @@ public: class Q_AUTOTEST_EXPORT QQuickVector4DValueType : public QQmlValueTypeBase<QVector4D> { - Q_PROPERTY(qreal x READ x WRITE setX) - Q_PROPERTY(qreal y READ y WRITE setY) - Q_PROPERTY(qreal z READ z WRITE setZ) - Q_PROPERTY(qreal w READ w WRITE setW) + Q_PROPERTY(qreal x READ x WRITE setX FINAL) + Q_PROPERTY(qreal y READ y WRITE setY FINAL) + Q_PROPERTY(qreal z READ z WRITE setZ FINAL) + Q_PROPERTY(qreal w READ w WRITE setW FINAL) Q_OBJECT public: QQuickVector4DValueType(QObject *parent = 0); @@ -207,22 +207,22 @@ public: class Q_AUTOTEST_EXPORT QQuickMatrix4x4ValueType : public QQmlValueTypeBase<QMatrix4x4> { - Q_PROPERTY(qreal m11 READ m11 WRITE setM11) - Q_PROPERTY(qreal m12 READ m12 WRITE setM12) - Q_PROPERTY(qreal m13 READ m13 WRITE setM13) - Q_PROPERTY(qreal m14 READ m14 WRITE setM14) - Q_PROPERTY(qreal m21 READ m21 WRITE setM21) - Q_PROPERTY(qreal m22 READ m22 WRITE setM22) - Q_PROPERTY(qreal m23 READ m23 WRITE setM23) - Q_PROPERTY(qreal m24 READ m24 WRITE setM24) - Q_PROPERTY(qreal m31 READ m31 WRITE setM31) - Q_PROPERTY(qreal m32 READ m32 WRITE setM32) - Q_PROPERTY(qreal m33 READ m33 WRITE setM33) - Q_PROPERTY(qreal m34 READ m34 WRITE setM34) - Q_PROPERTY(qreal m41 READ m41 WRITE setM41) - Q_PROPERTY(qreal m42 READ m42 WRITE setM42) - Q_PROPERTY(qreal m43 READ m43 WRITE setM43) - Q_PROPERTY(qreal m44 READ m44 WRITE setM44) + Q_PROPERTY(qreal m11 READ m11 WRITE setM11 FINAL) + Q_PROPERTY(qreal m12 READ m12 WRITE setM12 FINAL) + Q_PROPERTY(qreal m13 READ m13 WRITE setM13 FINAL) + Q_PROPERTY(qreal m14 READ m14 WRITE setM14 FINAL) + Q_PROPERTY(qreal m21 READ m21 WRITE setM21 FINAL) + Q_PROPERTY(qreal m22 READ m22 WRITE setM22 FINAL) + Q_PROPERTY(qreal m23 READ m23 WRITE setM23 FINAL) + Q_PROPERTY(qreal m24 READ m24 WRITE setM24 FINAL) + Q_PROPERTY(qreal m31 READ m31 WRITE setM31 FINAL) + Q_PROPERTY(qreal m32 READ m32 WRITE setM32 FINAL) + Q_PROPERTY(qreal m33 READ m33 WRITE setM33 FINAL) + Q_PROPERTY(qreal m34 READ m34 WRITE setM34 FINAL) + Q_PROPERTY(qreal m41 READ m41 WRITE setM41 FINAL) + Q_PROPERTY(qreal m42 READ m42 WRITE setM42 FINAL) + Q_PROPERTY(qreal m43 READ m43 WRITE setM43 FINAL) + Q_PROPERTY(qreal m44 READ m44 WRITE setM44 FINAL) Q_OBJECT public: QQuickMatrix4x4ValueType(QObject *parent = 0); @@ -288,18 +288,18 @@ class Q_AUTOTEST_EXPORT QQuickFontValueType : public QQmlValueTypeBase<QFont> Q_ENUMS(FontWeight) Q_ENUMS(Capitalization) - Q_PROPERTY(QString family READ family WRITE setFamily) - Q_PROPERTY(bool bold READ bold WRITE setBold) - Q_PROPERTY(FontWeight weight READ weight WRITE setWeight) - Q_PROPERTY(bool italic READ italic WRITE setItalic) - Q_PROPERTY(bool underline READ underline WRITE setUnderline) - Q_PROPERTY(bool overline READ overline WRITE setOverline) - Q_PROPERTY(bool strikeout READ strikeout WRITE setStrikeout) - Q_PROPERTY(qreal pointSize READ pointSize WRITE setPointSize) - Q_PROPERTY(int pixelSize READ pixelSize WRITE setPixelSize) - Q_PROPERTY(Capitalization capitalization READ capitalization WRITE setCapitalization) - Q_PROPERTY(qreal letterSpacing READ letterSpacing WRITE setLetterSpacing) - Q_PROPERTY(qreal wordSpacing READ wordSpacing WRITE setWordSpacing) + Q_PROPERTY(QString family READ family WRITE setFamily FINAL) + Q_PROPERTY(bool bold READ bold WRITE setBold FINAL) + Q_PROPERTY(FontWeight weight READ weight WRITE setWeight FINAL) + Q_PROPERTY(bool italic READ italic WRITE setItalic FINAL) + Q_PROPERTY(bool underline READ underline WRITE setUnderline FINAL) + Q_PROPERTY(bool overline READ overline WRITE setOverline FINAL) + Q_PROPERTY(bool strikeout READ strikeout WRITE setStrikeout FINAL) + Q_PROPERTY(qreal pointSize READ pointSize WRITE setPointSize FINAL) + Q_PROPERTY(int pixelSize READ pixelSize WRITE setPixelSize FINAL) + Q_PROPERTY(Capitalization capitalization READ capitalization WRITE setCapitalization FINAL) + Q_PROPERTY(qreal letterSpacing READ letterSpacing WRITE setLetterSpacing FINAL) + Q_PROPERTY(qreal wordSpacing READ wordSpacing WRITE setWordSpacing FINAL) public: enum FontWeight { Light = QFont::Light, |