main.cpp Example File | Qt WebChannel 5.4

- Qt 5.4
- Qt WebChannel
- Qt WebChannel Standalone Example
- main.cpp Example File
- Qt 5.4.2 Reference Documentation

# main.cpp Example File

standalone/main.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com>
    ** Contact: http://www.qt-project.org/legal
    **
    ** This file is part of the QtWebChannel module of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:LGPL21$
    ** Commercial License Usage
    ** Licensees holding valid commercial Qt licenses may use this file in
    ** accordance with the commercial license agreement provided with the
    ** Software or, alternatively, in accordance with the terms contained in
    ** a written agreement between you and Digia. For licensing terms and
    ** conditions see http://qt.digia.com/licensing. For further information
    ** use the contact form at http://qt.digia.com/contact-us.
    **
    ** 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 or version 3 as published by the Free
    ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
    ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
    ** following information to ensure the GNU Lesser General Public License
    ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
    ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    **
    ** In addition, as a special exception, Digia gives you certain additional
    ** rights. These rights are described in the Digia Qt LGPL Exception
    ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include "qwebchannel.h"

    #include <QApplication>
    #include <QDialog>
    #include <QVariantMap>
    #include <QDesktopServices>
    #include <QUrl>
    #include <QDebug>

    #include <QtWebSockets/QWebSocketServer>

    #include "../shared/websocketclientwrapper.h"
    #include "../shared/websockettransport.h"

    #include "ui_dialog.h"

    /*!
        An instance of this class gets published over the WebChannel and is then accessible to HTML clients.
    */
    class Dialog : public QObject
    {
        Q_OBJECT

    public:
        explicit Dialog(QObject *parent = 0)
            : QObject(parent)
        {
            ui.setupUi(&dialog);
            dialog.show();

            connect(ui.send, SIGNAL(clicked()), SLOT(clicked()));
        }

        void displayMessage(const QString &message)
        {
            ui.output->appendPlainText(message);
        }

    signals:
        /*!
            This signal is emitted from the C++ side and the text displayed on the HTML client side.
        */
        void sendText(const QString &text);

    public slots:
        /*!
            This slot is invoked from the HTML client side and the text displayed on the server side.
        */
        void receiveText(const QString &text)
        {
            displayMessage(tr("Received message: %1").arg(text));
        }

    private slots:
        /*!
            Note that this slot is private and thus not accessible to HTML clients.
        */
        void clicked()
        {
            const QString text = ui.input->text();

            if (text.isEmpty()) {
                return;
            }

            emit sendText(text);
            displayMessage(tr("Sent message: %1").arg(text));

            ui.input->clear();
        }

    private:
        QDialog dialog;
        Ui::Dialog ui;
    };

    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);

        // setup the QWebSocketServer
        QWebSocketServer server(QStringLiteral("QWebChannel Standalone Example Server"), QWebSocketServer::NonSecureMode);
        if (!server.listen(QHostAddress::LocalHost, 12345)) {
            qFatal("Failed to open web socket server.");
            return 1;
        }

        // wrap WebSocket clients in QWebChannelAbstractTransport objects
        WebSocketClientWrapper clientWrapper(&server);

        // setup the channel
        QWebChannel channel;
        QObject::connect(&clientWrapper, &WebSocketClientWrapper::clientConnected,
                         &channel, &QWebChannel::connectTo);

        // setup the dialog and publish it to the QWebChannel
        Dialog dialog;
        channel.registerObject(QStringLiteral("dialog"), &dialog);

        // open a browser window with the client HTML page
        QUrl url = QUrl::fromLocalFile(BUILD_DIR "/index.html");
        url.setQuery(QStringLiteral("webChannelBaseUrl=") + server.serverUrl().toString());
        QDesktopServices::openUrl(url);

        dialog.displayMessage(QObject::tr("Initialization complete, opening browser at %1.").arg(url.toDisplayString()));

        return app.exec();
    }

    #include "main.moc"