summaryrefslogtreecommitdiff
path: root/README.md
blob: 185c4fdcacec050e6a87be85c761e7a614a9357f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
### Introduction

The `QtWebChannel` module offers Qt applications a seamless way to publish `QObjects` for interaction
from HTML/JavaScript clients. These clients can either be inside local Qt `WebView`s or any other,
potentially remote, client which supports JavaScript and WebSockets.

It uses introspection on the `QObject`s and sends this serialized data to the clients. There, with
the help of a small JavaScript library, an object is created which simulates the API of the `QObject`.
Any invokable methods, including slots, can be called as well as properties read and written.
Additionally you can connect to signals and register JavaScript callbacks as handlers.

### Dependencies

This module depends on `QtBase` and `QtWebSockets`. Optionally, an additional module for QtQuick is
build which makes it easy to use the `QWebChannel` from QML. Furthermore, you can decide to use the
native IPC mechanism of `QtWebKit` for efficient message passing to QtQuick `WebView`'s.

### Building

    qmake-qt5
    make
    make install

### Usage from C++

To use the Qt/C++ library, add the following to your `QMake` project:

    QT += webchannel

Then, in your C++ code, construct a websocket transport and webchannel, then publish your `QObject`s:

    QWebSocketTransport transport;
    QWebChannel channel;
    channel.connectTo(&transport);

    channel.registerObject(QStringLiteral("foo"), myFooObj);
    ....

On the HTML/JavaScript client side, you need to embed `src/webchannel/qwebchannel.js` and setup
the connection to the WebSocket transport. The base URL for that can be found from C++ via
`transport.baseUrl()` after the transport was initialized, and must be passed to HTML clients:

    <script type="text/javascript" src="path/to/qwebchannel.js"></script>
    <script type="text/javascript">
    // note: baseUrl must be known
    new QWebChannel(baseUrl, function(channel) {
        foo.doStuff(); // calls doStuff slot or invokable method on myFooObj on the C++ side
    });
    </script>

An example which shows all this can be found in `examples/standalone`.

### Usage from QtQuick

For QML applications, use the following import:

    import QtWebChannel 1.0

Then setup the WebChannel and register objects to it:

    WebChannel {
        registeredObjects: [foo, bar, ...]

        connections: WebViewTransport {
            webViewExperimental: yourWebView.experimental
            onMessageReceived: {
                textEdit.text += "Received message: " + message + "\n";
            }
        }
    }

The above uses a `WebViewTransport` for efficient message passing between the server QML application
and HTML clients in a `WebView`, which must be setup as follows:

    WebView {
        id: yourWebView
        experimental.preferences.navigatorQtObjectEnabled: true
    }

The HTML client finally uses a similar setup as above, but can make use of the embedded resource
for `qwebchannel.js` and the `navigator.qt` object:

    <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script>
    <script type="text/javascript">
    new QWebChannel(navigator.qt, function(channel) {
        // do stuff with published objects
    });
    </script>

To see this in action, take a look at `examples/qml` and run the `example.qml` in `qmlscene`.