Advertisement
Guest User

qt vat class

a guest
Nov 11th, 2010
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.63 KB | None | 0 0
  1. #ifndef UTIL_VAR_H
  2. #define UTIL_VAR_H
  3. #include "stdinc.h"
  4.  
  5. class Var : public QVariant
  6. {
  7.  
  8. public:
  9.     Var();
  10.     Var(QString s);
  11.     Var(const char* s);
  12.     Var(QVariant s);
  13.     Var(QString key1,QVariant var1);
  14.     Var(QString key1,QVariant var1,QString key2,QVariant var2);
  15.     Var(QString key1,QVariant var1,QString key2,QVariant var2,QString key3,QVariant var3);
  16.     Var(QString key1,QVariant var1,QString key2,QVariant var2,QString key3,QVariant var3,QString key4,QVariant var4);
  17.  
  18.     void clear();
  19.  
  20.     void setProperty(QString name, Var value);
  21.     void setProperty(int index, Var value);
  22.     void append(Var value);
  23.     static QString outputString(Var value);
  24.     static QString sanitizeString( QString str );
  25.     bool empty();
  26.     Var operator [] (QString index);
  27. };
  28.  
  29. #endif // UTIL_VAR_H
  30.  
  31.  
  32. #include "util_var.h"
  33.  
  34. Var::Var()
  35. {
  36.     *this="";
  37. }
  38. Var::Var(QString s) :QVariant(s){
  39.  
  40. }
  41. Var::Var(const char* s) :QVariant(s){
  42.  
  43. }
  44. Var::Var(QVariant s) :QVariant(s){
  45.  
  46. }
  47.  
  48. // быстрые конструкторы для создания хеш-массивов
  49. Var::Var(QString key1,QVariant var1):QVariant(QVariantMap())
  50. {
  51.     convert(QVariant::Map);
  52.     setProperty(key1, var1);
  53. }
  54.  
  55. Var::Var(QString key1,QVariant var1,QString key2,QVariant var2):QVariant(QVariantMap())
  56. {
  57.     convert(QVariant::Map);
  58.     setProperty(key1, var1);
  59.     setProperty(key2, var2);
  60.  
  61. }
  62.  
  63. Var::Var(QString key1,QVariant var1,QString key2,QVariant var2,QString key3,QVariant var3):QVariant(QVariantMap())
  64. {
  65.     convert(QVariant::Map);
  66.     setProperty(key1, var1);
  67.     setProperty(key2, var2);
  68.     setProperty(key3, var3);
  69. }
  70.  
  71. Var::Var(QString key1,QVariant var1,QString key2,QVariant var2,QString key3,QVariant var3,QString key4,QVariant var4):QVariant(QVariantMap())
  72. {
  73.     convert(QVariant::Map);
  74.     setProperty(key1, var1);
  75.     setProperty(key2, var2);
  76.     setProperty(key3, var3);
  77.     setProperty(key4, var4);
  78.  
  79. }
  80.  
  81. // создаем еще один элемент в хеше (ну или ассоциативном массиве. хеш короче звучит)
  82. void Var::setProperty(QString name, Var value)
  83. {
  84.     convert(QVariant::Map);
  85.     QVariantMap vm=this->toMap();
  86.  
  87.     vm[name] =value;
  88.     this->setValue(vm);
  89. }
  90.  
  91. void Var::clear()
  92. {
  93.     this->setValue(QString(""));
  94. }
  95.  
  96. // аналогично, но превращаем нашу переменную в обычный массив!
  97. void Var::setProperty(int index, Var value)
  98. {
  99.     QVariantList l;
  100.    
  101.     if (this->type()==QVariant::List){
  102.         l=this->toList();
  103.     }
  104.     l.insert(index,value);
  105.     this->setValue(l);
  106. }
  107.  
  108. void Var::append(Var value)
  109. {
  110.     QVariantList l;
  111.     if (this->type()==QVariant::List){
  112.         l=this->toList();
  113.     }
  114.     l.append(value);
  115.     this->setValue(l);
  116. }
  117.  
  118. // для формирования JSON нужно почистить
  119. QString Var::sanitizeString( QString str )
  120. {
  121.   str.replace( QLatin1String( "\\" ), QLatin1String( "\\\\" ) );
  122.   str.replace( QLatin1String( "\"" ), QLatin1String( "\\\"" ) );
  123.   str.replace( QLatin1String( "\b" ), QLatin1String( "\\b" ) );
  124.   str.replace( QLatin1String( "\f" ), QLatin1String( "\\f" ) );
  125.   str.replace( QLatin1String( "\n" ), QLatin1String( "\\n" ) );
  126.   str.replace( QLatin1String( "\r" ), QLatin1String( "\\r" ) );
  127.   str.replace( QLatin1String( "\t" ), QLatin1String( "\\t" ) );
  128.   return QString( QLatin1String( "\"%1\"" ) ).arg( str );
  129. }
  130.  
  131. // вывод в JSON
  132. QString Var::outputString(Var value)
  133. {
  134.     if (value.type()==QVariant::Map){
  135.         QString rt="{";
  136.         QMapIterator<QString, QVariant> i(value.toMap());
  137.         bool first=true;
  138.         while (i.hasNext()) {
  139.              i.next();
  140.              if (!first) rt+=",";
  141.              Var value1= i.value();
  142.              rt+= sanitizeString(i.key())+": " +outputString(value1);
  143.              first=false;
  144.         }
  145.  
  146.         rt+="}";
  147.         return rt;
  148.     }else if(value.type()==QVariant::List){
  149.         QString rt="[";
  150.  
  151.         for (int i=0;i<value.toList().size();i++) {
  152.              if (i!=0) rt+=",";
  153.              rt+= outputString(value.toList()[i]);
  154.         }
  155.         rt+="]";
  156.         return rt;
  157.     }else{
  158.  
  159.         return sanitizeString(value.toString()).toUtf8();
  160.     }
  161. }
  162.  
  163. bool Var::empty()
  164. {
  165.     switch (this->type()){
  166.         case QVariant::Map: return this->toMap().empty();
  167.         case QVariant::List: return this->toList().empty();
  168.     default:
  169.             return !this->toBool();
  170.     }
  171.  
  172. }
  173.  
  174. // для быстрого доступа
  175. Var Var::operator [] (QString index)
  176. {
  177.     if (this->type()==QVariant::Map){
  178.         return this->toMap()[index];
  179.     }
  180.     return "";
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement