Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deMax от Декабря 03, 2014, 12:26



Название: Указатель на тип в QVariant
Отправлено: deMax от Декабря 03, 2014, 12:26
Есть QVariant a = (int)5;
Можно ли получить что то типа - int* b = &a.toInt();


Название: Re: Указатель на тип в QVariant
Отправлено: Пантер от Декабря 03, 2014, 12:31
toInt() возвращает временный объект, на который можно сослаться только константной ссылкой.


Название: Re: Указатель на тип в QVariant
Отправлено: deMax от Декабря 03, 2014, 12:38
Да я понимаю что этот код не будет работать, можно ли как то достучаться до ячейки памяти где этот int/QString хранится, нужно только для чтения?
Есть массивы с разными типами, хочется загнать все один с QVariant, и указатели раздать.


Название: Re: Указатель на тип в QVariant
Отправлено: Пантер от Декабря 03, 2014, 12:41
Что-то попахивает фигней какой-то. Конкретизируй задачу.


Название: Re: Указатель на тип в QVariant
Отправлено: deMax от Декабря 03, 2014, 12:46
Настройки программы хранятся в QMap. Хочу передать указатели на поля нужным классам, чтоб синхронизацию не городить.


Название: Re: Указатель на тип в QVariant
Отправлено: Igors от Декабря 03, 2014, 12:53
Да я понимаю что этот код не будет работать, можно ли как то достучаться до ячейки памяти где этот int/QString хранится, нужно только для чтения?
Есть массивы с разными типами, хочется загнать все один с QVariant, и указатели раздать.
Такой ячейки может просто не быть, ну точнее в ячейке варианта для int может находиться совсем не int. Вариант хранит что угодно и конвертирует. Можно хранить адрес QVariant, но и это не очень хорошо. Не используйте здесь адреса, не лепятся они

Настройки программы хранятся в QMap. Хочу передать указатели на поля нужным классам, чтоб синхронизацию не городить.
Передавайте ссылки на QVariant


Название: Re: Указатель на тип в QVariant
Отправлено: Пантер от Декабря 03, 2014, 12:55
Я с настройками делал через паттерн Обсервер. Синглтон настроек. Классы подписываются у него на изменение ключа.


Название: Re: Указатель на тип в QVariant
Отправлено: deMax от Декабря 08, 2014, 11:59
Пантер , спасибо.

А можно как то реализовать такое:
template <class T> void add(QString key, T* data) { QVariant::Type type = getType(T); map[key] = MapData(data, type);

или тут только антипаттерн копипаст работает?


Название: Re: Указатель на тип в QVariant
Отправлено: Пантер от Декабря 08, 2014, 12:40
Не понял вопроса. Что делает этот метод?


Название: Re: Указатель на тип в QVariant
Отправлено: deMax от Декабря 08, 2014, 13:26
Не понял вопроса. Что делает этот метод?
Вернет тип, для int это будет QVariant::int ... (даже не вернет, а заменит в процессе компиляции).
Просто в шаблоны ни switch по типу не вставить ни еще чего, а нужно очень.


Название: Re: Указатель на тип в QVariant
Отправлено: Igors от Декабря 08, 2014, 13:41
A почему не так
Код
C++ (Qt)
template <class T>
void add(const QString & key, const T & data)
{
map[key] = QVariant::fromValue(data);
}


Название: Re: Указатель на тип в QVariant
Отправлено: deMax от Декабря 08, 2014, 14:01
Igors , спасибо получилось. QVariant::fromValue(*data).type()

Код:
class IObserver
{
    typedef QPair<void*, QVariant::Type> MapData;
    QMap<QString, MapData> map;
public:
    template <class T> void add(QString key, T *data) {map[key] = MapData(data, QVariant::fromValue(*data).type());}
    virtual void set(QString key, QVariant data);
};

У меня гуи загоняет свои переменные в массив, а потом обсервер их через set обновляет.