Re: [Interest] QML MenuBar : works with PySide2 but not c++ ?

2021-06-02 Thread Nicholas Yue
I copied the qml loading code from another working example, I was just
testing a change in the QML content.

I'd have to dig further about the lambda

MenuBar.pro
===
QT += quick

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain
version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x06# disables all the
APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp

RESOURCES += main.qrc

# Additional import path used to resolve QML modules in Qt Creator's code
model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick
Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

main.qrc
===


MenuBar.qml




On Wed, 2 Jun 2021 at 20:36, Tony Rietwyk  wrote:

> Hi Nicholas,
>
> The short answer is because your C++ is doing completely different things
> to the python code.  :O)
>
> I'm not sure about using QML.  Have you included the qml file as a
> resource correctly to access via qrc:?  You aren't checking the result of
> the engine.load.  Also, why is the lambda exiting the application when the
> objectCreated matches the url?
>
> Have run the Qt QML examples?  How is your C++ code different to those?
>
> Hope that helps, Tony
>
>
> On 3/06/2021 11:33 am, Nicholas Yue wrote:
>
> Hi,
>
>   I am learning about QML.
>
>   I would like to find out why the PySide2 loading of the QML file results
> in a visible window but the C++ one does not. The compiled application runs
> but no window is displayed.
>
> MenuBar.qml
> ===
> import QtQuick 2.4
> import QtQuick.Controls 2.13
>
> ApplicationWindow {
> visible: true
> width: 720
> height: 480
> title: "simple window"
>
> menuBar: MenuBar{
> Menu{
> title: "Menu1"
> }
>
> Menu{
> title: "Menu2"
> }
>
> Menu{
> title: ""
> }
> }
> }
>
> main.cpp
> 
> #include 
> #include 
>
> int main(int argc, char *argv[])
> {
> QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
>
> QGuiApplication app(argc, argv);
>
> QQmlApplicationEngine engine;
> const QUrl url(QStringLiteral("qrc:/MenuBar.qml"));
> QObject::connect(, ::objectCreated,
>  , [url](QObject *obj, const QUrl ) {
> if (!obj && url == objUrl)
> QCoreApplication::exit(-1);
> }, Qt::QueuedConnection);
> engine.load(url);
>
> return app.exec();
> }
>
> main.py
> ===
> import sys
> from PySide2 import QtCore, QtGui, QtQml
>
> if __name__ == '__main__':
>
> QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
> app = QtGui.QGuiApplication(sys.argv)
>
> engine = QtQml.QQmlApplicationEngine()
>
> url = QtCore.QUrl.fromLocalFile('MenuBar.qml')
> engine.load(url)
> if not engine.rootObjects():
> sys.exit(-1)
>
> sys.exit(app.exec_())
>
> --
> Nicholas Yue
> Graphics - Arnold, Alembic, RenderMan, OpenGL, HDF5
> Custom Dev - C++ porting, OSX, Linux, Windows
> http://au.linkedin.com/in/nicholasyue
> https://vimeo.com/channels/naiadtools
>
> ___
> Interest mailing 
> listInterest@qt-project.orghttps://lists.qt-project.org/listinfo/interest
>
> ___
> Interest mailing list
> Interest@qt-project.org
> https://lists.qt-project.org/listinfo/interest
>


-- 
Nicholas Yue
Graphics - Arnold, Alembic, RenderMan, OpenGL, HDF5
Custom Dev - C++ porting, OSX, Linux, Windows
http://au.linkedin.com/in/nicholasyue
https://vimeo.com/channels/naiadtools
___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest


Re: [Interest] QML MenuBar : works with PySide2 but not c++ ?

2021-06-02 Thread Tony Rietwyk

Hi Nicholas,

The short answer is because your C++ is doing completely different 
things to the python code.  :O)


I'm not sure about using QML.  Have you included the qml file as a 
resource correctly to access via qrc:?  You aren't checking the result 
of the engine.load.  Also, why is the lambda exiting the application 
when the objectCreated matches the url?


Have run the Qt QML examples?  How is your C++ code different to those?

Hope that helps, Tony


On 3/06/2021 11:33 am, Nicholas Yue wrote:

Hi,

  I am learning about QML.

  I would like to find out why the PySide2 loading of the QML file 
results in a visible window but the C++ one does not. The compiled 
application runs but no window is displayed.


MenuBar.qml
===
import QtQuick 2.4
import QtQuick.Controls 2.13

ApplicationWindow {
    visible: true
    width: 720
    height: 480
    title: "simple window"

    menuBar: MenuBar{
        Menu{
            title: "Menu1"
        }

        Menu{
            title: "Menu2"
        }

        Menu{
            title: ""
        }
    }
}

main.cpp

#include 
#include 

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/MenuBar.qml"));
    QObject::connect(, ::objectCreated,
                     , [url](QObject *obj, const QUrl ) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

main.py
===
import sys
from PySide2 import QtCore, QtGui, QtQml

if __name__ == '__main__':

QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QtGui.QGuiApplication(sys.argv)

    engine = QtQml.QQmlApplicationEngine()

    url = QtCore.QUrl.fromLocalFile('MenuBar.qml')
    engine.load(url)
    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec_())

--
Nicholas Yue
Graphics - Arnold, Alembic, RenderMan, OpenGL, HDF5
Custom Dev - C++ porting, OSX, Linux, Windows
http://au.linkedin.com/in/nicholasyue 

https://vimeo.com/channels/naiadtools 



___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest
___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest


[Interest] QML MenuBar : works with PySide2 but not c++ ?

2021-06-02 Thread Nicholas Yue
Hi,

  I am learning about QML.

  I would like to find out why the PySide2 loading of the QML file results
in a visible window but the C++ one does not. The compiled application runs
but no window is displayed.

MenuBar.qml
===
import QtQuick 2.4
import QtQuick.Controls 2.13

ApplicationWindow {
visible: true
width: 720
height: 480
title: "simple window"

menuBar: MenuBar{
Menu{
title: "Menu1"
}

Menu{
title: "Menu2"
}

Menu{
title: ""
}
}
}

main.cpp

#include 
#include 

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/MenuBar.qml"));
QObject::connect(, ::objectCreated,
 , [url](QObject *obj, const QUrl ) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);

return app.exec();
}

main.py
===
import sys
from PySide2 import QtCore, QtGui, QtQml

if __name__ == '__main__':

QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QtGui.QGuiApplication(sys.argv)

engine = QtQml.QQmlApplicationEngine()

url = QtCore.QUrl.fromLocalFile('MenuBar.qml')
engine.load(url)
if not engine.rootObjects():
sys.exit(-1)

sys.exit(app.exec_())

-- 
Nicholas Yue
Graphics - Arnold, Alembic, RenderMan, OpenGL, HDF5
Custom Dev - C++ porting, OSX, Linux, Windows
http://au.linkedin.com/in/nicholasyue
https://vimeo.com/channels/naiadtools
___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest


Re: [Interest] QNetworkReply lambdas?

2021-06-02 Thread Jason H
After playing with this for the day, here's what I got:

// Application code


    struct FileResource {
        QString endpoint;
        QString sql;
        std::function func;
    };

    QList fileResources = {
        {
            "images",
            "SELECT filename FROM images WHERE synced is NULL ORDER BY created ASC",
            [=] (QNetworkReply* reply, QString filename){
                if (reply->error() == QNetworkReply::NoError) {
                    update("images",
                        {{"synced", QDateTime::currentDateTime()}},
                        {{"filename",filename}});
                }
            }
        }
    };


    for (const auto& resource : fileResources) {
        QSqlQuery rows(resource.sql);
        while(rows.next()) {
            remoteCloud->synchronousPostFile(remoteCloud, resource.endpoint,
                                             {rows.value("filename").toString()},
                                             resource.func);
        }
    }


 

// Library code:


void RemoteCloud::synchronousPostFile(RemoteCloud *remoteCloud, const QString& endpoint,
                    const QStringList& filenames,
                    std::function lambda) {
    QEventLoop loop;

    for (const auto& filename: filenames) {
        QFile *file = new QFile(filename);
        if (file->open(QIODevice::ReadOnly)) {
            m_filePointers[filename] = file;
            QNetworkReply * reply = remoteCloud->post(endpoint, mimeFromFilename(filename), file);
            QObject::connect(reply, ::finished, , ::quit);
            QObject::connect(reply, ::finished, reply, [=]{
                lambda(reply, filename);
                QFile *file = m_filePointers[filename];
                if (m_filePointers.remove(filename)) {
                    file->close();
                    file->deleteLater();
                }
                reply->deleteLater();
            });
            loop.exec(); // wait for finished
        } else {
            qWarning() << Q_FUNC_INFO << "could not open" << filename;
            delete file;
        }
    }
}

 

 

Which, because i call the lambda, I can make sure reply always gets deleted. You can call deleteLater() as many times as you want.  



Sent: Wednesday, June 02, 2021 at 11:16 AM
From: "Jérôme Godbout" 
To: "Jason H" , "interestqt-project.org" 
Subject: Re: [Interest] QNetworkReply lambdas?




Hi, might help, this won’t answer you question directly but might give some helper idea to ease the pain. What we did is a wrapper around QNetworkAccessManager class call RequestManager that own a QNetworkManager. It expose the following methods:

 

QNetworkReply* postRequest(QNetworkRequest& request, const QByteArray& payload);

// Do the same for put, update, get…

 

And signal slots:

signals:

    void replySuccess(QNetworkReply* reply);

    void replyError(QNetworkReply* reply);

 

public slots:

    void handleFinished(QNetworkReply *networkReply);

 

It manage the return code immediate and signal then valide the answer is a success or a failure. You can store the context or object into a map with your request, the reply will have the request into it so you can load back the needed information when you receive the replySuccess or reply Error signals back.  Make some helper to convert you payload to QByteArray so you can use it with json, text, etc…

 

I also made some ScopeAction class so my NetworkAccess manager reply handler can make sure the delete later is not forgetten:

 

connect(_manager, ::finished, this, ::handleFinished);

 

 

void RequestManager::handleFinished(QNetworkReply *networkReply)

{

    ScopeAction action_delete([&](){ networkReply->deleteLater(); });

… // process the reply error or success here and emit either the replySuccess or replyError signal here, this need to be non queued connection to avoid bad object access.

}

 

This helped me a lot to clean my network management for upper layer. So I can simply connect to the reply success or replyError and with the request pointer form the reply you can load the associated data and continue form that point easily.

 

The async/await would be nice, but I’m not sure this would play well with the Qt event loop and the object memory management. They are also super hard to debug the call stack is lost.

 



Jérôme Godbout, B. Ing.


Software / Firmware Team Lead
O: (418) 682-3636 ext.: 114  

C: (581) 777-0050 
godbo...@dimonoff.com



dimonoff.com

1015 Avenue Wilfrid-Pelletier, 

Québec, QC G1W 0C4, 4e étage



 

 


From: Interest  on behalf of Jason H 
Date: Wednesday, June 2, 2021 at 10:41 AM
To: interestqt-project.org 
Subject: [Interest] QNetworkReply lambdas?



I'm trying to figure out a more flexible way to do QNetworkReply. Ideally this would be through some async/await but I don't think Qt is "there" yet. (C++20 defines async/await, but there is not a library yet, and even Qt6 doesn't target C++20). So the callback lambda handler looks 

Re: [Interest] QNetworkReply lambdas?

2021-06-02 Thread Jason H
 


Yeah, we're both convergently evolving to the same thing. :-) I've used a similar approach to yours in the past with the success and fail handlers (just in JS though). I don't know that my current attempt will be superior.

 

If I were you... I would try with a variation of what I proposed (assuming we figure it out):

 

QNetworkReply* postRequest(QNetworkRequest& request, const QByteArray& payload, std::function successHandler, std::function failHandler);

 

rm->postRequest(req, payload, [](QNetworkReply *reply) { // success

        qDebug() << "joy" << req << *reply;

    },


    [](QNetworkReply *reply) { // fail

        qDebug() << "sad" << req << reply;

    }

);


 

 

Which, I debated but thought that 

 


rm->postRequest(req, payload, [req](QNetworkReply *reply) {

    if ( reply->error() == QNetworkReply::NoError)

        qDebug() << "joy" << req << *reply;

    else


        qDebug() << "sad" << req << *reply;

    

);

 

was marginally more readable, and having them defined seperately didn't add anything, but you can supply a default fail handler a little cleaner. 

 

 


rm->postRequest(req, payload, [](QNetworkReply *reply) { // success

        qDebug() << "joy" << req << *reply;

    },


    defaultFailHandler

);



 

 

 



Sent: Wednesday, June 02, 2021 at 11:16 AM
From: "Jérôme Godbout" 
To: "Jason H" , "interestqt-project.org" 
Subject: Re: [Interest] QNetworkReply lambdas?




Hi, might help, this won’t answer you question directly but might give some helper idea to ease the pain. What we did is a wrapper around QNetworkAccessManager class call RequestManager that own a QNetworkManager. It expose the following methods:

 

QNetworkReply* postRequest(QNetworkRequest& request, const QByteArray& payload);

// Do the same for put, update, get…

 

And signal slots:

signals:

    void replySuccess(QNetworkReply* reply);

    void replyError(QNetworkReply* reply);

 

public slots:

    void handleFinished(QNetworkReply *networkReply);

 

It manage the return code immediate and signal then valide the answer is a success or a failure. You can store the context or object into a map with your request, the reply will have the request into it so you can load back the needed information when you receive the replySuccess or reply Error signals back.  Make some helper to convert you payload to QByteArray so you can use it with json, text, etc…

 

I also made some ScopeAction class so my NetworkAccess manager reply handler can make sure the delete later is not forgetten:

 

connect(_manager, ::finished, this, ::handleFinished);

 

 

void RequestManager::handleFinished(QNetworkReply *networkReply)

{

    ScopeAction action_delete([&](){ networkReply->deleteLater(); });

… // process the reply error or success here and emit either the replySuccess or replyError signal here, this need to be non queued connection to avoid bad object access.

}

 

This helped me a lot to clean my network management for upper layer. So I can simply connect to the reply success or replyError and with the request pointer form the reply you can load the associated data and continue form that point easily.

 

The async/await would be nice, but I’m not sure this would play well with the Qt event loop and the object memory management. They are also super hard to debug the call stack is lost.

 



Jérôme Godbout, B. Ing.


Software / Firmware Team Lead
O: (418) 682-3636 ext.: 114  

C: (581) 777-0050 
godbo...@dimonoff.com



dimonoff.com

1015 Avenue Wilfrid-Pelletier, 

Québec, QC G1W 0C4, 4e étage



 

 


From: Interest  on behalf of Jason H 
Date: Wednesday, June 2, 2021 at 10:41 AM
To: interestqt-project.org 
Subject: [Interest] QNetworkReply lambdas?



I'm trying to figure out a more flexible way to do QNetworkReply. Ideally this would be through some async/await but I don't think Qt is "there" yet. (C++20 defines async/await, but there is not a library yet, and even Qt6 doesn't target C++20). So the callback lambda handler looks like the best option for now.

I have a QObject derived class, with a post() function. It takes an endpoint, and object (to be converted to JSON) and a lambda. Example:
remoteCloud->post("/login", credentials, [=](QNetworkReply* reply){
    if (reply->error() == QNetworkReply::NoError) {
    update("cartridge",
   {{"synced", QDateTime::currentDateTime()}},
   {{"cartridgeId", map["cartridgeId"]}});
    }
    reply->deleteLater();
});

With an implementation of:
template
QNetworkReply *RemoteCloud::post(const QString& endpoint, const QVariantMap& item, F ) {
    QNetworkReply* reply = m_nam.post(QNetworkRequest(endpoint), JSON(item));
    connect(reply, ::finished, lambda);
    return reply;
}


Note that a lot of the Qt examples use a connect statement like this:
connect(reply, ::finished, [request, reply](){ ... });

But when I tried to set this up, I either got static assert 

Re: [Interest] QNetworkReply lambdas?

2021-06-02 Thread Jérôme Godbout
Hi, might help, this won’t answer you question directly but might give some 
helper idea to ease the pain. What we did is a wrapper around 
QNetworkAccessManager class call RequestManager that own a QNetworkManager. It 
expose the following methods:

QNetworkReply* postRequest(QNetworkRequest& request, const QByteArray& payload);
// Do the same for put, update, get…

And signal slots:
signals:
void replySuccess(QNetworkReply* reply);
void replyError(QNetworkReply* reply);

public slots:
void handleFinished(QNetworkReply *networkReply);

It manage the return code immediate and signal then valide the answer is a 
success or a failure. You can store the context or object into a map with your 
request, the reply will have the request into it so you can load back the 
needed information when you receive the replySuccess or reply Error signals 
back.  Make some helper to convert you payload to QByteArray so you can use it 
with json, text, etc…

I also made some ScopeAction class so my NetworkAccess manager reply handler 
can make sure the delete later is not forgetten:

connect(_manager, ::finished, this, 
::handleFinished);


void RequestManager::handleFinished(QNetworkReply *networkReply)
{
ScopeAction action_delete([&](){ networkReply->deleteLater(); });
… // process the reply error or success here and emit either the replySuccess 
or replyError signal here, this need to be non queued connection to avoid bad 
object access.
}

This helped me a lot to clean my network management for upper layer. So I can 
simply connect to the reply success or replyError and with the request pointer 
form the reply you can load the associated data and continue form that point 
easily.

The async/await would be nice, but I’m not sure this would play well with the 
Qt event loop and the object memory management. They are also super hard to 
debug the call stack is lost.

Jérôme Godbout, B. Ing.

Software / Firmware Team Lead
O: (418) 682-3636 ext.: 114
C: (581) 777-0050
godbo...@dimonoff.com
[signature_182238435]
dimonoff.com
1015 Avenue Wilfrid-Pelletier,
Québec, QC G1W 0C4, 4e étage


From: Interest  on behalf of Jason H 

Date: Wednesday, June 2, 2021 at 10:41 AM
To: interestqt-project.org 
Subject: [Interest] QNetworkReply lambdas?
I'm trying to figure out a more flexible way to do QNetworkReply. Ideally this 
would be through some async/await but I don't think Qt is "there" yet. (C++20 
defines async/await, but there is not a library yet, and even Qt6 doesn't 
target C++20). So the callback lambda handler looks like the best option for 
now.

I have a QObject derived class, with a post() function. It takes an endpoint, 
and object (to be converted to JSON) and a lambda. Example:
remoteCloud->post("/login", credentials, [=](QNetworkReply* reply){
if (reply->error() == QNetworkReply::NoError) {
update("cartridge",
   {{"synced", QDateTime::currentDateTime()}},
   {{"cartridgeId", map["cartridgeId"]}});
}
reply->deleteLater();
});

With an implementation of:
template
QNetworkReply *RemoteCloud::post(const QString& endpoint, const QVariantMap& 
item, F ) {
QNetworkReply* reply = m_nam.post(QNetworkRequest(endpoint), 
JSON(item));
connect(reply, ::finished, lambda);
return reply;
}


Note that a lot of the Qt examples use a connect statement like this:
connect(reply, ::finished, [request, reply](){ ... });

But when I tried to set this up, I either got static assert errors or l-value 
errors.

However I am trying to go one better and have my RemoteCloud::post set up the 
connect with the lambda. Is this possible?

___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest
___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest


[Interest] QNetworkReply lambdas?

2021-06-02 Thread Jason H
I'm trying to figure out a more flexible way to do QNetworkReply. Ideally this 
would be through some async/await but I don't think Qt is "there" yet. (C++20 
defines async/await, but there is not a library yet, and even Qt6 doesn't 
target C++20). So the callback lambda handler looks like the best option for 
now.

I have a QObject derived class, with a post() function. It takes an endpoint, 
and object (to be converted to JSON) and a lambda. Example:
remoteCloud->post("/login", credentials, [=](QNetworkReply* reply){
if (reply->error() == QNetworkReply::NoError) {
update("cartridge",
   {{"synced", QDateTime::currentDateTime()}},
   {{"cartridgeId", map["cartridgeId"]}});
}
reply->deleteLater();
});

With an implementation of:
template
QNetworkReply *RemoteCloud::post(const QString& endpoint, const QVariantMap& 
item, F ) {
QNetworkReply* reply = m_nam.post(QNetworkRequest(endpoint), 
JSON(item));
connect(reply, ::finished, lambda);
return reply;
}


Note that a lot of the Qt examples use a connect statement like this:
connect(reply, ::finished, [request, reply](){ ... });

But when I tried to set this up, I either got static assert errors or l-value 
errors.

However I am trying to go one better and have my RemoteCloud::post set up the 
connect with the lambda. Is this possible?

___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest


Re: [Interest] Can't JSON.stringify an object in QML

2021-06-02 Thread Jason H


> Sent: Tuesday, June 01, 2021 at 9:22 PM
> From: "Tony Rietwyk" 
> To: interest@qt-project.org
> Subject: Re: [Interest] Can't JSON.stringify an object in QML
>
> HI Jason,
>
> I'm pretty sure this is NOT valid JSON:
>
>{"that": "other": {} }
>
> Either the value and comma for "that" is missing, or "other": {} should


Ok, so I was typing that as an example, and meant to type:
{"that": {"other": {} } }
In that I was trying to illustrate an empty object (which may or may not be 
valid JSON)... but it works with Qt's QJsonDocument::toJson()




___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest


Re: [Interest] QML defining an object property

2021-06-02 Thread Alexander Dyagilev

Thanks.

On 6/1/2021 10:52 AM, Pierre-Yves Siret wrote:



Le lun. 31 mai 2021 à 19:59, Alexander Dyagilev > a écrit :


Hello,

Am I right that this is not possible in QML?

readonlypropertyvarmainTbImg:{
    up:"some string",
up_check:"some another string"
}


The problem is that QML doesn't know how to parse it,  it can't know 
if it's a JS statement or a JS object definition. To disambiguate it 
you can either write:


    readonly property var mainTbImg: ({
        up: "some string",
        up_check: "some another string"
    })

or :

    readonly property var mainTbImg: {
        "up": "some string",
        "up_check": "some another string"
    }

Encompass the declaration with parenthesis or the property names with 
double quotes.
___
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest