summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2012-04-27 22:05:32 +0200
committerQt by Nokia <qt-info@nokia.com>2012-05-04 15:31:02 +0200
commitac300a166f801a6f6c0b15278e6893720a5726f8 (patch)
tree8fe61b473b8372d05f21fb457710267a8c95ec8c /src/gui
parente563ca1a7512a48e4d3e205ac8807d61c070d3f7 (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')
-rw-r--r--src/gui/text/qtextdocument.cpp31
-rw-r--r--src/gui/text/qtextdocument.h3
2 files changed, 14 insertions, 20 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;
diff --git a/src/gui/text/qtextdocument.h b/src/gui/text/qtextdocument.h
index aeb431c2bc..65ea1c8fd6 100644
--- a/src/gui/text/qtextdocument.h
+++ b/src/gui/text/qtextdocument.h
@@ -45,6 +45,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qsize.h>
#include <QtCore/qrect.h>
+#include <QtCore/qvariant.h>
#include <QtGui/qfont.h>
QT_BEGIN_HEADER
@@ -288,7 +289,7 @@ public Q_SLOTS:
protected:
virtual QTextObject *createObject(const QTextFormat &f);
- virtual QVariant loadResource(int type, const QUrl &name);
+ Q_INVOKABLE virtual QVariant loadResource(int type, const QUrl &name);
QTextDocument(QTextDocumentPrivate &dd, QObject *parent);
public: