Sérialisation des widget TXSLib
Tous les widgets de la librairie supportent les opérations de serialisation et désérialisaation. En d'autres termes, ils sont capables de sauver leur état dans un fichier, puis de relire cet état. Cela permet dans une application de laisser l'utilisateur modifier les propriétés de visualisation selon ses besoins, de sauver ces propriétés, puis lors d'une session de travail suivante de recharger cet état sans avoir à passer via des fichiers d'initialsation de type ini qui, du fait du nombre de propriétés des widgets pourraient se révéler très lourds.
Cette technique est mise en oeuvre via les méthodes SaveTo et LoadFrom de la classe TWidget.
L'exemple "SaveLoad" présente une démonstration de cette technique. Ci-dessous des extraits de code commentés. Cet exemple utilise 5 widgets : 1 de la classe TKnob et 4 de la classe TMeter. Il est équivalent à l'exemple "Meter". Cet exemple propose 3 boutons. Le bouton "Sauver..." permet de sauver l'état des 5 widgets dans des fichiers. Le bouton "Défauts" ramène les widgets à leur visualisation par défaut, telle qu'elle aurait été avant leur "customisation" par le programme. Le bouton "Recharge..." relit les fichiers de sérualsiation et applique les valerus des propriétés lues. Si on utilise ces 3 boutons dans l'ordre dans lequel ils sont présentés, on obtient alors une démonstration complète des opérations de sérialisation et désérialisation.
Afin d'être complet, cet exemple utilise une double opération de sérialsiation et désérialisation. L'une décrite ci-dessus via les boutons. L'autre permettant le retour à leur état par défaut. Pour mettre en place ce retour à leur état par défaut, le constructeur sérialise les widgets avant leur customisation. Le bouton "Défauts" désérialise cette version des widgets non customisés.
Le bouton "Sauver..." est liée au slot "OnSave()" de la classe "Dialog". Ci dessous le code de ce slot :
{
m_pKnob->SaveTo(QCoreApplication::applicationDirPath()+"/knobstate.twd");
m_pFullMeter->SaveTo(QCoreApplication::applicationDirPath()+"/meter1state.twd");
m_pQuarterMeter->SaveTo(QCoreApplication::applicationDirPath()+"/meter2state.twd");
m_p3QuarterMeter->SaveTo(QCoreApplication::applicationDirPath()+"/meter3state.twd");
m_pTopMeter->SaveTo(QCoreApplication::applicationDirPath()+"/meter4state.twd");
}
Chaque Widget dispose de son propre fichier de sérialisition. l'extension "twd" n'est pas imposée. L'extension des fichiers peut être n'importe laquelle.
Le bouton "Recharge..." est liée au slot "OnLoad()" de la classe "Dialog". Ci dessous le code de ce slot :
{
m_pKnob->LoadFrom(QCoreApplication::applicationDirPath()+"/knobstate.twd");
m_pFullMeter->LoadFrom(QCoreApplication::applicationDirPath()+"/meter1state.twd");
m_pQuarterMeter->LoadFrom(QCoreApplication::applicationDirPath()+"/meter2state.twd");
m_p3QuarterMeter->LoadFrom(QCoreApplication::applicationDirPath()+"/meter3state.twd");
m_pTopMeter->LoadFrom(QCoreApplication::applicationDirPath()+"/meter4state.twd");
m_pKnob->setVisible(true);
m_pFullMeter->setVisible(true);
m_pQuarterMeter->setVisible(true);
m_p3QuarterMeter->setVisible(true);
m_pTopMeter->setVisible(true);
}
Certaines propriétés doivent recevoir un traitement spécial après lune opération de desérialisation : Les propriétés exportées par la classe QWidget de visibilité et d'activation du widget accessibles via les méthodes "setVisible", "isVisible", "setEnabled" et "isEnabled" sont sauvegardées dans le fichier. Cependant selon la méthode d'utilisation d'un widget (A titre d'exemple : Est-il dans un layout ou pas ?) ces propriétés peuvent ne pas être sauvegardées tyel que l'on s'y attend. Cela dépend de la classe QWidget et non pas de la classe TWidget. Ainsi comme le montre l'exemple ci-dessus, il est bon de régler ces propriétés après désérialisation.
Tous les widgets du type scalaire sauevtn leur propriété "value". Cela est pratique mais dans bien des cas, il sera nécessaire de réinitialiser cette propriété à sa valeur par défaut lors d'une désérialisation.
Exemple d'un fichier de sérialisation d'un widget
<?xml version="1.0" encoding="UTF-8"?>
<TXS Uuid="ea7762c3-9242-4a2e-bc74-ac7b8cdcbfc8" Type="TMeter" Widget_Enabled="1" Widget_Visible="0" Widget_Left="0" Widget_Top="0" Widget_Width="330" Widget_Height="200" Widget_BorderStyle="1" Widget_BorderShadow="16" Widget_BorderLineStyle="1" Widget_BorderWidth="1" Widget_BorderEffectWidth="1" Widget_BorderColor="4288716960" Widget_BackgroundIsTransparent="1" Widget_BackgroundColor="4293980400" Widget_LeftMargin="4" Widget_RightMargin="4" Widget_TopMargin="4" Widget_BottomMargin="4" Widget_FocusStyle="3" Widget_FocusColor="4288716960" Widget_CaptionVisible="1" Widget_AutoRefresh="1" Widget_ShadeWhenDisabled="1" Widget_ShadeColor="4278190080" Widget_ShadeOpacity="96" Widget_ShadePattern="7" Caption_Label="Galvanomètre" Caption_HrzAlignment="4" Caption_VrtAlignment="128" Caption_ForegroundColor="4278190080" Caption_Font="Segoe UI,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" Caption_FontSizeIsAuto="1" Scalar_NumberFormat="8" Scalar_TimeFormat="25" Scalar_DigitsBeforeDecimalSeparator="8" Scalar_DigitsAfterDecimalSeparator="3" Scalar_DigitsForIntegers="8" Scalar_ForceSign="0" Scalar_PadCharacter=" " Scalar_MessageOverflow="Hors Gamme" Scalar_ForceCLocal="0" Scalar_GroupSeparator="1" Scalar_XOBFormat="0" Scalar_ShowXOB="1" Scalar_UpperXOB="0" Scalar_Label="" Scalar_HrzAlignment="4" Scalar_VrtAlignment="128" Scalar_ForegroundColor="4278190080" Scalar_Font="Segoe UI,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" Scalar_FontSizeIsAuto="0" Scalar_NColorZones="0" Scalar_NumericIndicatorVisible="1" Scalar_Unit="37" Scalar_UserDefinedUnit="" Scalar_Prefix="" Scalar_Value="0" CircularScalar_AxisStyle="1" CircularScalar_AxisColor="4278190080" CircularScalar_AxisTicksVisible="1" CircularScalar_AxisTicksColor="4278190080" CircularScalar_AxisTicksSpecification="0" CircularScalar_AxisNumberOfTicks="11" CircularScalar_AxisTicksInterval="10" CircularScalar_AxisTicksSize="10" CircularScalar_AxisMinorTicksVisible="1" CircularScalar_AxisNumberOfMinorTicks="5" CircularScalar_AxisMinorTicksSize="5" CircularScalar_AxisLabelsVisible="1" CircularScalar_AxisLabelsColor="4278190080" CircularScalar_AxisLabelsFont="Segoe UI,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" CircularScalar_AxisNumberFormat="8" CircularScalar_AxisDigBeforeSep="3" CircularScalar_AxisDigAfterSep="3" CircularScalar_AxisThickness="1" CircularScalar_OriginAnglePosition="290" CircularScalar_ExcursionAngle="320" CircularScalar_ArcOrigin="-1760" CircularScalar_ArcSpan="-5120" CircularScalar_DisplayColorZones="1" CircularScalar_DisplayColorZonesLeds="1" CircularScalar_ColorZonesThickness="20" CircularScalar_ColorZonesStyle="1" CircularScalar_ColorZonesBackColor="4294967295" CircularScalar_ColorZonesIsTransparent="1" CircularScalar_Use3DEffectForColorZones="1" CircularScalar_ColorZonesBlocks="50" CircularScalar_ColorZonesBlocksWidth="6" CircularScalar_DefaultColorZonesLedsColorBelow="4294575365" CircularScalar_DefaultColorZonesLedsColorAbove="4286842888" CircularScalar_DisplayOutOfBoundsLeds="1" CircularScalar_DefaultColorZonesLedsColorOutOfBounds="4286611584" CircularScalar_AutoAdjustZonesColorLeds="1" CircularScalar_ScaleVisible="1" Meter_Minimum="0" Meter_Maximum="100" Meter_HasBackground="1" Meter_HasBorder="1" Meter_MeterBackColor="4294967295" Meter_MeterBorderColor="4278190080" Meter_NeedleBaseStyle="5" Meter_NeedleBaseRadius="20" Meter_NeedleStyle="2" Meter_NeedleThickness="5" Meter_NeedleColor="4278190080" Meter_AlwaysCentered="0" Meter_AlwaysCircular="0" Meter_InternalRadius="0"/>