Hi,
You can retreive the properties changed from meta information of those
properties on you object.

I'm not sure I understand your use case but here's some info that may help.

auto meta_obj = target_object_->metaObject();
for(int i = 0; i < meta_obj.propertyCount(); ++i)
{
  auto meta_property = meta_obj.property();
  auto method_signal = meta_property.notifySignal();
  connect(target_object_, method_signal, myHandler, handle_slot_name);
}

You may want to keep a list of object connections if they don't get deleted
when swaping to disconnected them.

So you can now handle those property changed from C++ without writting Qml
binding directly. This also work with signal and slots.

Most likely, you want to bind on any changed properties of the skin and
revaluate the whole skin manager update sequence I guess.

Jerome


On Tue, Aug 23, 2016 at 5:36 PM, Xavier Bigand <flamaros.xav...@gmail.com>
wrote:

> That the problem, I can easily call my SkinManager::updateSkin when the skin 
> changed, because it's a cpp attribut too (the selected skin). But I have to 
> call it when the QmlEngine have reevaluated the properties values not before.
>
> Getting property values directly from cpp code doesn't execute bindings (as 
> much as I know), so I am trying to call this slot (SkinManager::updateSkin) 
> from Qml where it should be easier to fix this calling order issue.
>
>
> If I create a property that depends of all others it be reevaluated after the 
> others, then I will be able to invoke my cpp slot from his onChanged signal.
>
> The difficulty is to create this property.
>
>
>
>
> My QML component looks like to this :
>
>
> HomeDesignSkins.qml :
>
>
> Item {
>
>     id: homeDesignSkins
>
>        readonly property color accentucationColor: {                          
>                                              // In cpp 
> SkinManager::updateSkin() method can be invoked before the execution of this 
> binding,
>
>         if (application.product === Product.ProductOutdoor)                   
>                                          // the better way to solve this 
> issue is to create a binding dependency
>
>             return "#45a785"
>
>         else if (application.product === Product.ProductMyDreamHome)
>
>         {
>
>             if (settings.skin === "MyDreamHomeThemeCanson")
>
>                 return Qt.rgba(235 / 255, 130 / 255, 122 / 255, 255 / 255)
>
>             else if (settings.skin === "MyDreamHomeThemeMilli")
>
>                 return Qt.rgba(242 / 255, 118 / 255, 82 / 255, 255 / 255)
>
>             else
>
>                 return Qt.rgba(145 / 255, 135 / 255, 148 / 255, 255 / 255)
>
>         }
>
>         else
>
>             return "#8da7c0"
>
>     }
>
>
>     ...
>
>
>     // Here we have numerous properties used to describe our GUI skin (some 
> are shared with the cpp code for our 3D rendering)
>
>
>     Object {
>
>         property string homeDesignSkinsProperties: {
>
>                    var propertyValues
>
>                    for (var propertyName in homeDesignSkins)
>
>                           propertyValues += propertyName + " "                
>                  // How retrieving the property values by their names
>
>                    return propertyValues
>
>              }
>
>
>             onHomeDesignSkinsPropertiesChanged: {                             
>         // This signal should be called once after that all properties of 
> homeDesignSkins where reevaluted when the skin changed
>
>                    skinManager.updateSkin()                                   
>                   // skinManager is the instance of the cpp SkinManager 
> singleton, updateSkin is an Q_INVOKABLE method
>
>             }
>
>     }
>
> }
>
>
>
>
>
>
> 2016-08-23 21:29 GMT+02:00 Jason H <jh...@gmx.com>:
>
>> If I understand you correctly, and I probably don't, the skin component
>>
>> Skin {
>> signal skinPropertyChanged();
>> property color accentucationColor: "red"
>> onAccentucationColorChanged: skinPropertyChanged()
>> }
>>
>> SkinManager {// exposed C++ class
>>     id:skinManager
>>     property var currentSkin: null;
>>     onCurrrentSkinChanged: updateSkin(); // handle when the skin switches
>> }
>>    Connections {
>>       target: currentSkin
>>       onSkinPropertyChanged: id:skinManager.updateSkin() // handle when
>> propterties of the skin change.
>>    }
>>
>> Will that work?
>>
>>
>> *Sent:* Tuesday, August 23, 2016 at 1:12 PM
>> *From:* "Xavier Bigand" <flamaros.xav...@gmail.com>
>> *To:* interest@qt-project.org
>> *Subject:* [Interest] Force property's binding to be executed from C++
>> Hi,
>>
>> To skin our GUI we have a dedicated qml component instanced once that
>> contains all necessary values under properties.
>> I am able to access to those properties from C++ code but they aren't
>> correctly synchronized with the selected skin.
>>
>> Here is my cpp code :
>>
>>
>>     void SkinManagerWrapper::updateSkin() const
>>
>>     {
>>
>>         QObject*    skinItem = mRootObject->findChild<QObject*>("hdGUI", 
>> Qt::FindDirectChildrenOnly);
>>
>>
>>
>>         core::SkinManager*  skinManager = core::SkinManager::singleton();
>>
>>
>>
>>         // General
>>
>>         skinManager->accentuationColor = 
>> convert(skinItem->property("accentuationColor").value<QColor>());           
>> // skinManager->accentuationColor is actually a cpp property ;-)
>>
>>     }
>>
>>
>> The property method return the previous value before the execution of the
>> binding, because in the qml binding the value is depending of the selected
>> skin.
>>
>> As workaround I am trying to create a qml property that depend of all
>> properties of our skin component ("HomeDesignSkins"), but If it is possible
>> to retrieve dynamically properties names of the component, I can't figure
>> out retrieving values of properties by string names.
>> The Idea is to be able to use the onChanged signal of this property to
>> invoke my cpp updateSkin method, this should resolve dependency order issue.
>>
>> Maybe their is an other way to do it, else I am searching to way to
>> retrieve property values in qml from their names.
>>
>>
>> --
>> Xavier
>> _______________________________________________ Interest mailing list
>> Interest@qt-project.org http://lists.qt-project.org/ma
>> ilman/listinfo/interest
>>
>
>
>
> --
> Xavier
>
> _______________________________________________
> Interest mailing list
> Interest@qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to