2009-11-18 39 views
3

輸出目前,我在維護遺留應用程序的過程。這有像相當多的結構:格式qDebug爲QMaps

QMap<QString, QMap<QString, QMap<QString, QMap<QString, QVariant> > > > Dep; 

由於接口幾乎不用,我只需要作微小的調整,我想保持的結構,因爲它是,但可能總需要一些重構。 但是爲了能夠理解正在發生的事情,目前我只是放了一些qDebug()< < Dep;在那裏,並試圖理解輸出。

問題是,它沒有格式化的。有誰知道一個小腳本來創建一個更好理解的顯示格式?或者可能是Qt的一些補丁?

給你舉一個例子我的痛苦:

QMap(("Test enable|test enable block", QMap(("disabled", QMap(("testblock1", QMap(("enableblock", QVariant(QString, "false"))) )) ) ("enabled" , QMap(("testblock1", QMap(("enableblock", QVariant(QString, "true"))) )) )) ) ("Test enable|test enable key" , QMap(("disabled", QMap(("testblock1|testkey", QMap(("enablekey", QVariant(QString, "false"))) )) ) ("enabled" , QMap(("testblock1|testkey", QMap(("enablekey", QVariant(QString, "true"))) )) )) ) ("testinsertitems|Insert item" , QMap(("test1", QMap(("testinsertitems|testinsert", QMap(("insertitems", QVariant(QVariantMap, QMap(("test1", QVariant(QString, "test1"))) ))) ) ("testinsertitems|testremove" , QMap(("removeitems", QVariant(QVariantMap, QMap(("test1", QVariant(QString, "test1"))) ))) )) ) ("test2" , QMap(("testinsertitems|testinsert", QMap(("insertitems", QVariant(QVariantMap, QMap(("test2", QVariant(QString, "test2"))) ))) ) ("testinsertitems|testremove" , QMap(("removeitems", QVariant(QVariantMap, QMap(("test2", QVariant(QString, "test2"))) ))) )) )) ) ("testsetminmax|test setmin" , QMap(("2", QMap(("testsetminmax|testkey1", QMap(("setmin", QVariant(int, 2))) ) ("testsetminmax|testkey2" , QMap(("setmax", QVariant(int, 2))) )) ) ("3" , QMap(("testsetminmax|testkey1", QMap(("setmin", QVariant(int, 3))) ) ("testsetminmax|testkey2" , QMap(("setmax", QVariant(int, 3))) )) )) ) ("testsetvalue|test set value" , QMap(("2", QMap(("testsetvalue|testkey1", QMap(("setvalue", QVariant(QString, "2"))) ) ("testsetvalue|testkey2" , QMap(("setvalue", QVariant(QString, "2"))) ) ("testsetvalue|testkey3" , QMap(("setvalue", QVariant(QString, "2"))) )) ) ("3" , QMap(("testsetvalue|testkey1", QMap(("setvalue", QVariant(QString, "3"))) ) ("testsetvalue|testkey2" , QMap(("setvalue", QVariant(QString, "3"))) ) ("testsetvalue|testkey3" , QMap(("setvalue", QVariant(QString, "3"))) )) )) )) 

感謝

回答

9

這一個是n維和將使用標準qDebug輸出爲已知類型:

template<class NonMap> 
struct Print 
{ 
    static void print(const QString& tabs, const NonMap& value) 
    { 
     qDebug() << tabs << value; 
    } 
}; 

template <class Key, class ValueType > 
struct Print<class QMap<Key, ValueType> > 
{ 
    static void print(const QString& tabs, const QMap< Key, ValueType>& map) 
    { 
     const QString extraTab = tabs + "\t"; 
     QMapIterator<Key, ValueType> iterator(map); 
     while(iterator.hasNext()) 
     { 
      iterator.next(); 
      qDebug() << tabs << iterator.key(); 
      Print<ValueType>::print(extraTab, iterator.value()); 
     } 
    } 
}; 

template<class Type> 
void printMe(const Type& type) 
{ 
    Print<Type>::print("", type); 
}; 
+1

令人印象深刻的使用模板和遞歸:) –

4

四維結構非常難以顯現。 但是,如何處理一些小循環?

typedef QMap<QString, QVariant> T1; 
typedef QMap<QString, T1> T2; 
typedef QMap<QString, T2> T3; 

foreach(T3 i, dep) { 
    cout << "******" << i.key() << "*******" << endl << endl; 
    foreach (T2 j, i.value()) { 
     cout << j.key() << ":" << endl; 
     foreach (T3 k, j.value()) { 
      cout << k.key() << "= "; 
      foreach (QVariant l, k.value()) { 
       cout << l.key() << ": " << l.value() << " "; 
      } 
      cout << endl; 
     } 
    } 
} 

當然,使用namespace std。按照你的喜好添加setw()。希望你明白這個主意。