summaryrefslogtreecommitdiffstats
path: root/Modules/kde3uic.cmake
Commit message (Expand)AuthorAgeFilesLines
* Convert CMake-language commands to lower caseKitware Robot2012-08-131-5/+5
* Modules: Fix spelling 'To distributed' -> 'To distribute'Todd Gamblin2010-08-091-1/+1
* Convert CMake non-find modules to BSD LicenseBrad King2009-09-281-0/+13
* BUG: fix #3324: KDE3Macros.cmake didn't find Qt designer plugins whenAlexander Neundorf2006-08-271-1/+1
* BUG: kde3: use QT_UIC_EXECUTABLE instead of simply uicAlexander Neundorf2006-05-191-1/+1
* ENH: add real-world-tested and used KDE3 support, and obsolete FindKDE.cmake,...Alexander Neundorf2006-03-091-0/+20
t-e5fcad302d86d316390c6b0f62759a067313e8a9.zip'>Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.zip
Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.gz
Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.bz2
Long live Qt 4.5!
Diffstat (limited to 'examples/xmlpatterns/qobjectxmlmodel')
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/forms/mainwindow.ui196
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/main.cpp53
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/mainwindow.cpp135
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/mainwindow.h64
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp459
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h139
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.pro13
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/queries.qrc7
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/queries/statisticsInHTML.xq58
-rw-r--r--examples/xmlpatterns/qobjectxmlmodel/queries/wholeTree.xq3
10 files changed, 1127 insertions, 0 deletions
diff --git a/examples/xmlpatterns/qobjectxmlmodel/forms/mainwindow.ui b/examples/xmlpatterns/qobjectxmlmodel/forms/mainwindow.ui
new file mode 100644
index 0000000..ad43284
--- /dev/null
+++ b/examples/xmlpatterns/qobjectxmlmodel/forms/mainwindow.ui
@@ -0,0 +1,196 @@
+<ui version="4.0" >
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>600</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>QObjectXmlModel Example</string>
+ </property>
+ <widget class="QWidget" name="centralwidget" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>29</y>
+ <width>800</width>
+ <height>549</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4" >
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <italic>true</italic>
+ </font>
+ </property>
+ <property name="text" >
+ <string>See the About menu entry for a description of this example.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="inheritanceTab" >
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="wholeTreeTab" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>778</width>
+ <height>475</height>
+ </rect>
+ </property>
+ <attribute name="title" >
+ <string>Whole QObjectTree</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout" >
+ <item>
+ <widget class="QSplitter" name="splitter" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <widget class="QTextEdit" name="wholeTree" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Minimum" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ <property name="html" >
+ <string>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="acceptRichText" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QTextEdit" name="wholeTreeOutput" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ <property name="html" >
+ <string>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="acceptRichText" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="htmlTab" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>778</width>
+ <height>475</height>
+ </rect>
+ </property>
+ <attribute name="title" >
+ <string>Statistics in HTML </string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <item>
+ <widget class="QSplitter" name="splitter_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <widget class="QTextEdit" name="htmlQueryEdit" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ <property name="html" >
+ <string>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
+p, li { white-space: pre-wrap; }
+&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="acceptRichText" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QWebView" name="htmlOutput" >
+ <property name="url" >
+ <url>
+ <string>about:blank</string>
+ </url>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuHelp" >
+ <property name="title" >
+ <string>Help</string>
+ </property>
+ <addaction name="actionAbout" />
+ </widget>
+ <addaction name="menuHelp" />
+ </widget>
+ <widget class="QStatusBar" name="statusbar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>578</y>
+ <width>800</width>
+ <height>22</height>
+ </rect>
+ </property>
+ </widget>
+ <action name="actionAbout" >
+ <property name="text" >
+ <string>About</string>
+ </property>
+ <property name="shortcut" >
+ <string>Ctrl+B</string>
+ </property>
+ </action>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>QWebView</class>
+ <extends>QWidget</extends>
+ <header>QtWebKit/QWebView</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/xmlpatterns/qobjectxmlmodel/main.cpp b/examples/xmlpatterns/qobjectxmlmodel/main.cpp
new file mode 100644
index 0000000..c73d211
--- /dev/null
+++ b/examples/xmlpatterns/qobjectxmlmodel/main.cpp
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "mainwindow.h"
+
+int main(int argc, char* argv[])
+{
+ Q_INIT_RESOURCE(queries);
+ QApplication app(argc, argv);
+ MainWindow mainWindow;
+ mainWindow.show();
+ return app.exec();
+}
diff --git a/examples/xmlpatterns/qobjectxmlmodel/mainwindow.cpp b/examples/xmlpatterns/qobjectxmlmodel/mainwindow.cpp
new file mode 100644
index 0000000..056ebae
--- /dev/null
+++ b/examples/xmlpatterns/qobjectxmlmodel/mainwindow.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include <QtXmlPatterns>
+
+#include "mainwindow.h"
+#include "qobjectxmlmodel.h"
+#include "xmlsyntaxhighlighter.h"
+
+MainWindow::MainWindow()
+{
+ setupUi(this);
+
+ new XmlSyntaxHighlighter(wholeTreeOutput->document());
+
+ /* Setup the font. */
+ {
+ QFont font("Courier");
+ font.setFixedPitch(true);
+
+ wholeTree->setFont(font);
+ wholeTreeOutput->setFont(font);
+ htmlQueryEdit->setFont(font);
+ }
+
+ QXmlNamePool namePool;
+ QObjectXmlModel qObjectModel(this, namePool);
+ QXmlQuery query(namePool);
+
+ /* The QObject tree as XML view. */
+ {
+ query.bindVariable("root", qObjectModel.root());
+ query.setQuery(QUrl("qrc:/queries/wholeTree.xq"));
+
+ Q_ASSERT(query.isValid());
+ QByteArray output;
+ QBuffer buffer(&output);
+ buffer.open(QIODevice::WriteOnly);
+
+ /* Let's the use the formatter, so it's a bit easier to read. */
+ QXmlFormatter serializer(query, &buffer);
+
+ query.evaluateTo(&serializer);
+ buffer.close();
+
+ {
+ QFile queryFile(":/queries/wholeTree.xq");
+ queryFile.open(QIODevice::ReadOnly);
+ wholeTree->setPlainText(QString::fromUtf8(queryFile.readAll()));
+ wholeTreeOutput->setPlainText(QString::fromUtf8(output.constData()));
+ }
+ }
+
+ /* The QObject occurrence statistics as HTML view. */
+ {
+ query.setQuery(QUrl("qrc:/queries/statisticsInHTML.xq"));
+ Q_ASSERT(query.isValid());
+
+ QByteArray output;
+ QBuffer buffer(&output);
+ buffer.open(QIODevice::WriteOnly);
+
+ /* Let's the use the serializer, so we gain a bit of speed. */
+ QXmlSerializer serializer(query, &buffer);
+
+ query.evaluateTo(&serializer);
+ buffer.close();
+
+ {
+ QFile queryFile(":/queries/statisticsInHTML.xq");
+ queryFile.open(QIODevice::ReadOnly);
+ htmlQueryEdit->setPlainText(QString::fromUtf8(queryFile.readAll()));
+ htmlOutput->setHtml(QString(output));
+ }
+ }
+}
+
+void MainWindow::on_actionAbout_triggered()
+{
+ QMessageBox::about(this,
+ tr("About QObject XML Model"),
+ tr("<p>The <b>QObject XML Model</b> example shows "
+ "how to use XQuery on top of data of your choice "
+ "without converting it to an XML document.</p>"
+ "<p>In this example a QSimpleXmlNodeModel subclass "
+ "makes it possible to query a QObject tree using "
+ "XQuery and retrieve the result as pointers to "
+ "QObjects, or as XML.</p>"
+ "<p>A possible use case of this could be to write "
+ "an application that tests a graphical interface "
+ "against Human Interface Guidelines, or that "
+ "queries an application's data which is modeled "
+ "using a QObject tree and dynamic properties."));
+}
+
+
diff --git a/examples/xmlpatterns/qobjectxmlmodel/mainwindow.h b/examples/xmlpatterns/qobjectxmlmodel/mainwindow.h
new file mode 100644
index 0000000..362bd0e
--- /dev/null
+++ b/examples/xmlpatterns/qobjectxmlmodel/mainwindow.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QFile>
+
+#include "ui_mainwindow.h"
+
+//! [0]
+class MainWindow : public QMainWindow,
+ private Ui_MainWindow
+{
+ Q_OBJECT
+
+ public:
+ MainWindow();
+
+ private slots:
+ void on_actionAbout_triggered();
+};
+//! [0]
+
+#endif
diff --git a/examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp b/examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp
new file mode 100644
index 0000000..3eee67a
--- /dev/null
+++ b/examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp
@@ -0,0 +1,459 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QVector>
+#include <QtDebug>
+
+#include <QCoreApplication>
+#include <QMetaProperty>
+#include <QXmlQuery>
+#include <QXmlResultItems>
+
+#include "qobjectxmlmodel.h"
+
+QT_BEGIN_NAMESPACE
+
+/*
+<metaObjects>
+ <metaObject className="QObject"/>
+ <metaObject className="QWidget" superClass="QObject">
+ </metaObject>
+ ...
+</metaObjects>
+<QObject objectName="MyWidget" property1="..." property2="..."> <!-- This is root() -->
+ <QObject objectName="MyFOO" property1="..."/>
+ ....
+</QObject>
+*/
+
+QObjectXmlModel::QObjectXmlModel(QObject *const object, const QXmlNamePool &np)
+ : QSimpleXmlNodeModel(np),
+ m_baseURI(QUrl::fromLocalFile(QCoreApplication::applicationFilePath())),
+ m_root(object),
+ m_allMetaObjects(allMetaObjects())
+{
+ Q_ASSERT(m_baseURI.isValid());
+}
+
+//! [5]
+QXmlNodeModelIndex QObjectXmlModel::qObjectSibling(const int pos, const QXmlNodeModelIndex &n) const
+{
+ Q_ASSERT(pos == 1 || pos == -1);
+ Q_ASSERT(asQObject(n));
+
+ const QObject *parent = asQObject(n)->parent();
+ if (parent) {
+ const QList<QObject *> &children = parent->children();
+ const int siblingPos = children.indexOf(asQObject(n)) + pos;
+
+ if (siblingPos >= 0 && siblingPos < children.count())
+ return createIndex(children.at(siblingPos));
+ else
+ return QXmlNodeModelIndex();
+ }
+ else
+ return QXmlNodeModelIndex();
+}
+//! [5]
+
+//! [1]
+QObjectXmlModel::QObjectNodeType QObjectXmlModel::toNodeType(const QXmlNodeModelIndex &n)
+{
+ return QObjectNodeType(n.additionalData() & (15 << 26));
+}
+//! [1]
+
+//! [9]
+QObjectXmlModel::AllMetaObjects QObjectXmlModel::allMetaObjects() const
+{
+ QXmlQuery query(namePool());
+ query.bindVariable("root", root());
+ query.setQuery("declare variable $root external;"
+ "$root/descendant-or-self::QObject");
+ Q_ASSERT(query.isValid());
+
+ QXmlResultItems result;
+ query.evaluateTo(&result);
+ QXmlItem i(result.next());
+
+ AllMetaObjects objects;
+ while (!i.isNull()) {
+ const QMetaObject *moo = asQObject(i.toNodeModelIndex())->metaObject();
+ while (moo) {
+ if (!objects.contains(moo))
+ objects.append(moo);
+ moo = moo->superClass();
+ }
+ i = result.next();
+ }
+
+ Q_ASSERT(!objects.contains(0));
+ return objects;
+}
+//! [9]
+
+QXmlNodeModelIndex QObjectXmlModel::metaObjectSibling(const int pos, const QXmlNodeModelIndex &n) const
+{
+ Q_ASSERT(pos == 1 || pos == -1);
+ Q_ASSERT(!n.isNull());
+
+ const int indexOf = m_allMetaObjects.indexOf(static_cast<const QMetaObject *>(n.internalPointer())) + pos;
+
+ if (indexOf >= 0 && indexOf < m_allMetaObjects.count())
+ return createIndex(const_cast<QMetaObject *>(m_allMetaObjects.at(indexOf)), MetaObject);
+ else
+ return QXmlNodeModelIndex();
+}
+
+//! [2]
+QXmlNodeModelIndex QObjectXmlModel::nextFromSimpleAxis(SimpleAxis axis, const QXmlNodeModelIndex &n) const
+{
+ switch (toNodeType(n))
+ {
+ case IsQObject:
+ {
+ switch (axis)
+ {
+ case Parent:
+ return createIndex(asQObject(n)->parent());
+
+ case FirstChild:
+ {
+ if (!asQObject(n) || asQObject(n)->children().isEmpty())
+ return QXmlNodeModelIndex();
+ else
+ return createIndex(asQObject(n)->children().first());
+ }
+
+ case NextSibling:
+ return qObjectSibling(1, n);
+
+//! [10]
+ case PreviousSibling:
+ {
+ if (asQObject(n) == m_root)
+ return createIndex(qint64(0), MetaObjects);
+ else
+ return qObjectSibling(-1, n);
+ }
+//! [10]
+ }
+ Q_ASSERT(false);
+ }
+
+//! [7]
+ case QObjectClassName:
+ case QObjectProperty:
+ {
+ Q_ASSERT(axis == Parent);
+ return createIndex(asQObject(n));
+ }
+//! [7]
+//! [2]
+//! [3]
+
+//! [11]
+ case MetaObjects:
+ {
+ switch (axis)
+ {
+ case Parent:
+ return QXmlNodeModelIndex();
+ case PreviousSibling:
+ return QXmlNodeModelIndex();
+ case NextSibling:
+ return root();
+ case FirstChild:
+ {
+ return createIndex(const_cast<QMetaObject*>(m_allMetaObjects.first()),MetaObject);
+ }
+ }
+ Q_ASSERT(false);
+ }
+//! [11]
+
+ case MetaObject:
+ {
+ switch (axis)
+ {
+ case FirstChild:
+ return QXmlNodeModelIndex();
+ case Parent:
+ return createIndex(qint64(0), MetaObjects);
+ case PreviousSibling:
+ return metaObjectSibling(-1, n);
+ case NextSibling:
+ return metaObjectSibling(1, n);
+ }
+ }
+
+ case MetaObjectClassName:
+ case MetaObjectSuperClass:
+ {
+ Q_ASSERT(axis == Parent);
+ return createIndex(asQObject(n), MetaObject);
+ }
+//! [3]
+//! [4]
+ }
+
+ Q_ASSERT(false);
+ return QXmlNodeModelIndex();
+}
+//! [4]
+
+//! [6]
+QVector<QXmlNodeModelIndex> QObjectXmlModel::attributes(const QXmlNodeModelIndex& n) const
+{
+ QVector<QXmlNodeModelIndex> result;
+ QObject *const object = asQObject(n);
+
+ switch(toNodeType(n))
+ {
+ case IsQObject:
+ {
+ const QMetaObject *const metaObject = object->metaObject();
+ const int count = metaObject->propertyCount();
+ result.append(createIndex(object, QObjectClassName));
+
+ for (int i = 0; i < count; ++i) {
+ const QMetaProperty qmp(metaObject->property(i));
+ const int ii = metaObject->indexOfProperty(qmp.name());
+ if (i == ii)
+ result.append(createIndex(object, QObjectProperty | i));
+ }
+ return result;
+ }
+//! [6]
+
+ case MetaObject:
+ {
+ result.append(createIndex(object, MetaObjectClassName));
+ result.append(createIndex(object, MetaObjectSuperClass));
+ return result;
+ }
+//! [8]
+ default:
+ return QVector<QXmlNodeModelIndex>();
+ }
+}
+//! [8]
+
+QObject *QObjectXmlModel::asQObject(const QXmlNodeModelIndex &n)
+{
+ return static_cast<QObject *>(n.internalPointer());
+}
+
+bool QObjectXmlModel::isProperty(const QXmlNodeModelIndex n)
+{
+ return n.additionalData() & QObjectProperty;
+}
+
+QUrl QObjectXmlModel::documentUri(const QXmlNodeModelIndex& ) const
+{
+ return m_baseURI;
+}
+
+QXmlNodeModelIndex::NodeKind QObjectXmlModel::kind(const QXmlNodeModelIndex& n) const
+{
+ switch (toNodeType(n))
+ {
+ case IsQObject:
+ case MetaObject:
+ case MetaObjects:
+ return QXmlNodeModelIndex::Element;
+
+ case QObjectProperty:
+ case MetaObjectClassName:
+ case MetaObjectSuperClass:
+ case QObjectClassName:
+ return QXmlNodeModelIndex::Attribute;
+ }
+
+ Q_ASSERT(false);
+ return QXmlNodeModelIndex::Element;
+}
+
+QXmlNodeModelIndex::DocumentOrder QObjectXmlModel::compareOrder(const QXmlNodeModelIndex& , const QXmlNodeModelIndex& ) const
+{
+ return QXmlNodeModelIndex::Follows; // TODO
+}
+
+//! [0]
+QXmlNodeModelIndex QObjectXmlModel::root() const
+{
+ return createIndex(m_root);
+}
+//! [0]
+
+QXmlNodeModelIndex QObjectXmlModel::root(const QXmlNodeModelIndex& n) const
+{
+ QObject *p = asQObject(n);
+ Q_ASSERT(p);
+
+ do {
+ QObject *const candidate = p->parent();
+ if (candidate)
+ p = candidate;
+ else
+ break;
+ }
+ while (true);
+
+ return createIndex(p);
+}
+
+/*!
+ We simply throw all of them into a QList and
+ return an iterator over it.
+ */
+QXmlNodeModelIndex::List QObjectXmlModel::ancestors(const QXmlNodeModelIndex n) const
+{
+ const QObject *p = asQObject(n);
+ Q_ASSERT(p);
+
+ QXmlNodeModelIndex::List result;
+ do {
+ QObject *const candidate = p->parent();
+ if (candidate) {
+ result.append(createIndex(candidate, 0));
+ p = candidate;
+ }
+ else
+ break;
+ }
+ while (true);
+
+ return result;
+}
+
+QMetaProperty QObjectXmlModel::toMetaProperty(const QXmlNodeModelIndex &n)
+{
+ const int propertyOffset = n.additionalData() & (~QObjectProperty);
+ const QObject *const qo = asQObject(n);
+ return qo->metaObject()->property(propertyOffset);
+}
+
+QXmlName QObjectXmlModel::name(const QXmlNodeModelIndex &n) const
+{
+ switch (toNodeType(n))
+ {
+ case IsQObject:
+ return QXmlName(namePool(), QLatin1String("QObject"));
+ case MetaObject:
+ return QXmlName(namePool(), QLatin1String("metaObject"));
+ case QObjectClassName:
+ case MetaObjectClassName:
+ return QXmlName(namePool(), QLatin1String("className"));
+ case QObjectProperty:
+ return QXmlName(namePool(), toMetaProperty(n).name());
+ case MetaObjects:
+ return QXmlName(namePool(), QLatin1String("metaObjects"));
+ case MetaObjectSuperClass:
+ return QXmlName(namePool(), QLatin1String("superClass"));
+ }
+
+ Q_ASSERT(false);
+ return QXmlName();
+}
+
+QVariant QObjectXmlModel::typedValue(const QXmlNodeModelIndex &n) const
+{
+ switch (toNodeType(n))
+ {
+ case QObjectProperty:
+ {
+ const QVariant &candidate = toMetaProperty(n).read(asQObject(n));
+ if (isTypeSupported(candidate.type()))
+ return candidate;
+ else
+ return QVariant();
+ }
+
+ case MetaObjectClassName:
+ return QVariant(static_cast<QMetaObject*>(n.internalPointer())->className());
+
+ case MetaObjectSuperClass:
+ {
+ const QMetaObject *const superClass = static_cast<QMetaObject*>(n.internalPointer())->superClass();
+ if (superClass)
+ return QVariant(superClass->className());
+ else
+ return QVariant();
+ }
+
+ case QObjectClassName:
+ return QVariant(asQObject(n)->metaObject()->className());
+
+ default:
+ return QVariant();
+ }
+}
+
+/*!
+ Returns \c true if QVariants of type \a type can be used
+ in QtXmlPatterns, otherwise \c false.
+ */
+bool QObjectXmlModel::isTypeSupported(QVariant::Type type)
+{
+ /* See data/qatomicvalue.cpp too. */
+ switch (type)
+ {
+ /* Fallthrough all these. */
+ case QVariant::Char:
+ case QVariant::String:
+ case QVariant::Url:
+ case QVariant::Bool:
+ case QVariant::ByteArray:
+ case QVariant::Int:
+ case QVariant::LongLong:
+ case QVariant::ULongLong:
+ case QVariant::Date:
+ case QVariant::DateTime:
+ case QVariant::Time:
+ case QVariant::Double:
+ return true;
+ default:
+ return false;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h b/examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h
new file mode 100644