Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Указатель на QString


Автор: a1ien 29.5.2011, 18:41
Нужно соотнести большое количество членов класса текстовым именам. Использую вот такую конструкцию.
Код

QMap<QString,void*> vars;

Собственно заполняем в конструкторе.
Код

 vars.insert("name",(void*)&this->name);
 vars.insert("extraCellsCount",(void*)&this->extraCellsCount);

При этом
в самом классе
Код

    QString name;
    int extraCellsCount;

В инт записать не проблема, а вот как в QString в таком случае данные писать??

Автор: borisbn 29.5.2011, 19:25
да так же
Код

*( (QString*)vars[ "name" ] ) = QString( "bla_bla_bla" );

а что за задача, в которой без такого извращения нельзя ?
То, что это извращение, думаю, даже ты, как автор, спорить не будешь smile

Автор: a1ien 29.5.2011, 20:19
Да понятно что изврат. Но реально по другому ХЗ как.(если предложите хороший вариант то я вам скажу ОГРОМНЕЙШЕЕ спасибо)
Если помнишь то до этого обсуждали http://forum.vingrad.ru/forum/topic-326110/0.html вот такое дерево )
Это фигня служит для хранения распарсенных объектов из http://ru.wikipedia.org/wiki/AMF_(%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8)
У меня только две идеи по реализации хранения данных. Первый вариант это тот класс для хранения дерева. Но там не удобно доставать назад данные. так-как если надо работать со многими данными оттуда то код будет плохо читаем.
Либо второй вариант который я тут описал. То есть мы создаем точную иерархию классов и потом заполняем данными.

Автор: triclosan 29.5.2011, 22:10
Если ваш класс наследник QObject можно все "переинатчить", использовав методы 
Код

objectName ()
и
setObjectName ( const QString & name )


если я правильно понял задачу

Автор: Любитель 29.5.2011, 22:36
Наверно, имелось ввиду http://doc.qt.nokia.com/latest/qobject.html#setProperty и http://doc.qt.nokia.com/latest/qobject.html#property. 

Автор: a1ien 29.5.2011, 22:46
Код

objectName ()
и
setObjectName ( const QString & name )

Это вряди что-то даст(Точнее тут это не поможет). Мне нужно заполнять члены класса данными по его имени/
При этом у нас там лежат и простые типы.

Цитата

Наверно, имелось ввиду http://doc.qt.nokia.com/latest/qobject.html#setProperty и http://doc.qt.nokia.com/latest/qobject.html#property. 


Вот это похоже.... но тут минус в том что В варианте не особо удобно хранить свои типы(точнее если там хранить много разных).

Автор: math64 30.5.2011, 07:49
Возможно, лучше делать так:
Код

QMap<QString,QVariant> vars;

В QVariant можно положить большинство Qt-шных классов, а также void*

Автор: math64 30.5.2011, 08:04
Или так:
Код

class MyAbstractPointer {
public:
virtual void f() = 0;
};
class MyIntPointer : public MyAbstractPointer {
int* p;
public:
MyIntPointer(int* pi) { p = pi; }
virtual void f() { cout << *p; }
};
class MyStringPointer : public MyAbstractPointer {
QString* p;
public:
MyIntPointer(QString* ps) { p = ps; }
virtual void f() { cout << *p; }
};

QMap <QString, MyAbstractPointer*> vars;
vars.insert("name", new MyStringPointer(&this->name));
 vars.insert("extraCellsCount", new MyIntPointer(&this->extraCellsCount));

Автор: Любитель 30.5.2011, 16:25
Цитата(a1ien @  29.5.2011,  22:46 Найти цитируемый пост)
Вот это похоже.... но тут минус в том что В варианте не особо удобно хранить свои типы(точнее если там хранить много разных).

QVariant как раз предназначен для хранения чего угодно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)