Отформатируйте вывод qDebug для QMaps - PullRequest
3 голосов
/ 18 ноября 2009

В настоящее время я поддерживаю устаревшее приложение. Это имеет довольно много структур, таких как:

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

Поскольку интерфейсы почти не используются, и мне нужно лишь внести незначительные корректировки, я бы хотел сохранить структуру такой, какая она есть, хотя в любом случае может потребоваться некоторый рефакторинг. Но чтобы понять, что происходит, в настоящее время я просто добавил qDebug () << Dep; и попытайтесь понять вывод. </p>

Проблема в том, что у него вообще нет форматирования. Кто-нибудь знает маленький скрипт для создания более понятного формата отображения? Или, может быть, какие-то патчи к 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") ) )  ) )  ) )  ) )

Спасибо

Ответы [ 2 ]

9 голосов
/ 19 ноября 2009

Это для 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);
};
4 голосов
/ 18 ноября 2009

Четырехмерная структура, как известно, трудно визуализировать. Но как насчет маленьких петель?

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 (), как вам нравится. Надеюсь, вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...