[SailfishDevel] QML C++ Integration not working in Sailfish

christopher.lamb at thurweb.ch christopher.lamb at thurweb.ch
Tue Feb 25 17:33:49 UTC 2014


Hi Antonio

Here is a simplified example from one of my projects, showing a number  
of ways to expose C++ to QML.

I tend to use qmlRegisterXXXX when exposing C++ objects with methods,  
and SetContextProperty when I want to expose simple stuff like global  
constants only.

I do things that way because it works for me ...

Chris



#ifdef QT_QML_DEBUG
#include <QtQuick>
#endif

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>

#include <sailfishapp.h>

//#include "landedtorch.h" //harmattan
#include "gsttorch.h" //sailfish
#include "satinfosource.h"
#include "operatingsystem.h"
#include "windowingsystem.h"
#include "telepathyhelper.h"
#include "landedtheme.h"
#include  "jsonstorage.h"

//HELPER Functions getting system information which will be exported to QML

bool isSimulator()
{
     bool simulator;
     #if defined(QT_SIMULATOR)
         simulator = true;
     #else
         // real device or emulator
         simulator = false;
     #endif
     return simulator;
}

int getOperatingSystem()
{
     //C++ representation of the OperatingSystem enumg
     const OperatingSystem Os;
     int OSId;
     #if defined(Q_OS_SYMBIAN)
         OSId = Os.Symbian;
     #elif defined(Q_OS_MAC64)
         OSId = Os.Mac64;
     #elif defined(Q_OS_UNIX)
         OSId = Os.Unix;
     #elif defined(Q_OS_WIN32)
         OSId = Os.Win32;
     #elif defined(Q_OS_WIN64)
         OSId = Os.Win64;
     #elif defined(Q_OS_WINCE)
         OSId = Os.WinCE;
     #elif defined(Q_OS_SIMULATOR)
         OSId = Os.Simulator;
     #else
         // other OS
         OSId = Os.Other;
     #endif
     return OSId;
}

//END HELPER Functions

static QObject *theme_singletontype_provider(QQmlEngine *engine,  
QJSEngine *scriptEngine)
{
     Q_UNUSED(engine)
     Q_UNUSED(scriptEngine)

     LandedTheme *landedTheme = new LandedTheme();
     return landedTheme;
}

static QObject *jsonStorage_singletontype_provider(QQmlEngine *engine,  
QJSEngine *scriptEngine)
{
     Q_UNUSED(engine)
     Q_UNUSED(scriptEngine)

     JSONStorage *jsonStorage = new JSONStorage();
     return jsonStorage;
}

int main(int argc, char *argv[])
{
     bool simulator = isSimulator();

     //expose an enum of operating systems types to QML
     qmlRegisterUncreatableType<OperatingSystem>("OperatingSystem", 1,  
0, "OperatingSystem", "");
     int OperatingSystemId = getOperatingSystem();

     qmlRegisterType<GstTorch>("GstTorch",1,0,"GstTorch");
     qmlRegisterType<TelepathyHelper>("TelepathyHelper",1,0,"TelepathyHelper");
     qmlRegisterType<SatInfoSource>("SatInfoSource",1,0,"SatInfoSource");
     qmlRegisterSingletonType<LandedTheme>("LandedTheme", 1, 0,  
"LandedTheme", theme_singletontype_provider);
      
qmlRegisterSingletonType<JSONStorage>("JSONStorage",1,0,"JSONStorage",  
jsonStorage_singletontype_provider);

     QScopedPointer<QGuiApplication> app(SailfishApp::application(argc, argv));
     QScopedPointer<QQuickView> view(SailfishApp::createView());

     view->rootContext()->setContextProperty("OperatingSystemId",   
OperatingSystemId);
     view->rootContext()->setContextProperty("simulator",  simulator);

     view->setSource(SailfishApp::pathTo("qml/landed26_QT5.qml"));
     view->show();
     view->showFullScreen();
     return app->exec();
}


Zitat von "Andrey Kozhevnikov" <coderusinbox at gmail.com>:

> ???
>
> contextProperty should be set BEFORE loading QML source.
>
> On 25.02.2014 21:33, martin.grimme at gmail.com wrote:
>> Hi,
>>
>> you should set the context property after loading the QML source.  
>> Then it ought to be available from QML.
>>
>> Martin
>>
>>
>> Am Tue Feb 25 2014 15:06:39 GMT+0100 (CET) schrieb  
>> antonio.cano.gomez at ovi.com:
>>> Hi,
>>>
>>> I am trying to do a simple Sailfish aplication that uses a c++  
>>> library.  I try to connect my qml code with the C++ code.
>>>
>>> First I create QObject extended library:
>>>
>>>
>>> #ifndef BLOOMFILTERS_H
>>> #define BLOOMFILTERS_H
>>>
>>>
>>> #include <QObject>
>>> #include "svn/bloom-read-only/bloom_filter.hpp"
>>>
>>> class Bloomfilters : public QObject
>>> {
>>>    Q_OBJECT
>>>
>>>
>>> public:
>>>    Q_INVOKABLE  void generateFilterInvokable2() const ;
>>>    Q_INVOKABLE  void generateFilterInvokable(const QString  
>>> &cadenaK, const QString &cadenaM) const ;
>>>
>>>
>>>    explicit Bloomfilters(QObject *parent = 0);
>>>
>>>    void generateFilter() ;
>>>
>>>    Q_INVOKABLE void insertElement(const QString &cadena) ;
>>>
>>>    Q_INVOKABLE bool checkElement(const QString &cadena) ;
>>>
>>>
>>>
>>>
>>> signals:
>>>
>>>
>>> public slots:
>>>
>>> private:
>>>    bloom_parameters _parameters ;
>>>    bloom_filter _filter;
>>>    bool _filter_charged;
>>>    QString _k;
>>> };
>>>
>>> #endif // BLOOMFILTERS_H
>>>
>>>
>>>
>>> An I try to connect this with my sailfish application with the code:
>>>
>>>        QGuiApplication *app = SailfishApp::application(argc, argv);
>>>        QQuickView *view = SailfishApp::createView();
>>>        Bloomfilters  * bloomfilters = new Bloomfilters();
>>>        view->rootContext()->setContextProperty("Bloomfilters",  
>>> bloomfilters);
>>>        view->setSource(SailfishApp::pathTo("qml/bloomfilter.qml"));
>>>        view->showFullScreen();
>>>        return app->exec();
>>>
>>>
>>> But this is not working.
>>>
>>> Someone have any idea about what am I doing wrong?
>>>
>>> Best Regards
>
> _______________________________________________
> SailfishOS.org Devel mailing list
>





More information about the Devel mailing list