Russian Qt Forum
Ноябрь 25, 2024, 18:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель на тип в QVariant  (Прочитано 6303 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Декабрь 03, 2014, 12:26 »

Есть QVariant a = (int)5;
Можно ли получить что то типа - int* b = &a.toInt();
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 03, 2014, 12:31 »

toInt() возвращает временный объект, на который можно сослаться только константной ссылкой.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Декабрь 03, 2014, 12:38 »

Да я понимаю что этот код не будет работать, можно ли как то достучаться до ячейки памяти где этот int/QString хранится, нужно только для чтения?
Есть массивы с разными типами, хочется загнать все один с QVariant, и указатели раздать.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 03, 2014, 12:41 »

Что-то попахивает фигней какой-то. Конкретизируй задачу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Декабрь 03, 2014, 12:46 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 03, 2014, 12:53 »

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

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Декабрь 03, 2014, 12:55 »

Я с настройками делал через паттерн Обсервер. Синглтон настроек. Классы подписываются у него на изменение ключа.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Декабрь 08, 2014, 11:59 »

Пантер , спасибо.

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

или тут только антипаттерн копипаст работает?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Декабрь 08, 2014, 12:40 »

Не понял вопроса. Что делает этот метод?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Декабрь 08, 2014, 13:26 »

Не понял вопроса. Что делает этот метод?
Вернет тип, для int это будет QVariant::int ... (даже не вернет, а заменит в процессе компиляции).
Просто в шаблоны ни switch по типу не вставить ни еще чего, а нужно очень.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 08, 2014, 13:41 »

A почему не так
Код
C++ (Qt)
template <class T>
void add(const QString & key, const T & data)
{
map[key] = QVariant::fromValue(data);
}
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #11 : Декабрь 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 обновляет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.259 секунд. Запросов: 23.