diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2012-04-27 22:05:32 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-04 15:31:02 +0200 |
commit | ac300a166f801a6f6c0b15278e6893720a5726f8 (patch) | |
tree | 8fe61b473b8372d05f21fb457710267a8c95ec8c /src/gui/text/qtextdocument.cpp | |
parent | e563ca1a7512a48e4d3e205ac8807d61c070d3f7 (diff) |
Load resources in in QTextDocument correctly
In Qt 4, we loaded resources through the QTextEdit or
QTextControl if they were the parent of the document.
Modularization for Qt 5 broke this, as we can't cast
the parent to a QTextEdit anymore.
The fix is to make the loadResource() methods in QTextControl
and QTextEdit invokable and discover and invoke them at
runtime on the parent object.
Task-number: QTBUG-25116
Change-Id: Iba04bc16849b0c5ddcd275f12d1a386a8fe591bf
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
Diffstat (limited to 'src/gui/text/qtextdocument.cpp')
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 89f6d1a3af..ec660dd050 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -52,6 +52,7 @@ #include <qtextcodec.h> #include <qthread.h> #include <qcoreapplication.h> +#include <qmetaobject.h> #include "qtexthtmlparser_p.h" #include "qpainter.h" @@ -1896,7 +1897,8 @@ void QTextDocument::addResource(int type, const QUrl &name, const QVariant &reso When called by Qt, \a type is one of the values of QTextDocument::ResourceType. - If the QTextDocument is a child object of a QTextEdit, QTextBrowser, + If the QTextDocument is a child object of a QObject that has an invokable + loadResource method such as QTextEdit, QTextBrowser or a QTextDocument itself then the default implementation tries to retrieve the data from the parent. */ @@ -1905,24 +1907,15 @@ QVariant QTextDocument::loadResource(int type, const QUrl &name) Q_D(QTextDocument); QVariant r; - QTextDocument *doc = qobject_cast<QTextDocument *>(parent()); - if (doc) { - r = doc->loadResource(type, name); - } -#if 0 - // ### Qt5: reenable -#ifndef QT_NO_TEXTEDIT - else if (QTextEdit *edit = qobject_cast<QTextEdit *>(parent())) { - QUrl resolvedName = edit->d_func()->resolveUrl(name); - r = edit->loadResource(type, resolvedName); - } -#endif -#ifndef QT_NO_TEXTCONTROL - else if (QWidgetTextControl *control = qobject_cast<QWidgetTextControl *>(parent())) { - r = control->loadResource(type, name); + QObject *p = parent(); + if (p) { + const QMetaObject *me = p->metaObject(); + int index = me->indexOfMethod("loadResource(int,QUrl)"); + if (index >= 0) { + QMetaMethod loader = me->method(index); + loader.invoke(p, Q_RETURN_ARG(QVariant, r), Q_ARG(int, type), Q_ARG(QUrl, name)); + } } -#endif -#endif // handle data: URLs if (r.isNull() && name.scheme().compare(QLatin1String("data"), Qt::CaseInsensitive) == 0) { @@ -1933,7 +1926,7 @@ QVariant QTextDocument::loadResource(int type, const QUrl &name) } // if resource was not loaded try to load it here - if (!doc && r.isNull() && name.isRelative()) { + if (!qobject_cast<QTextDocument *>(p) && r.isNull() && name.isRelative()) { QUrl currentURL = d->url; QUrl resourceUrl = name; |