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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Архитектура модели с параметрами различных типов  (Прочитано 2526 раз)
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4175



Просмотр профиля
« Ответ #15 : Сентябрь 16, 2018, 21:04 »

Вариант, предложенный ViTech, мне нравится. Но для него нужно иметь шпаргалку "0 -Temperature X", "1 - Temperature Y" и т.д., 50 штук.
Так ViTech сразу предложил описать enum и никакие шпаргалки ненужны, а IDE еще будет автодополнять эти идентификаторы при наборе.

   - темплейтный метод push, который инициализирует упомянутый словарь (т.е. определяет тип и добавляет в мапу адрес параметра и его тип).
А как вы в мапе тип сохраняете, в type_info?
Записан
sergek
Хакер
*****
Offline Offline

Сообщений: 634


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #16 : Сентябрь 16, 2018, 21:05 »

Не удержался, попробовал сделать пример. Оказалось, что темплейтный метод очень простой:

Код
C++ (Qt)
struct CAddress {
   void* address;
   size_t type;
 
   CAddress() {
       address = nullptr;
       type = QMetaType::UnknownType;
   }
 
   CAddress(void* ptr, size_t t) {
       address = ptr;
       type = t;
   }
};
 
class CInterface
{
protected:
   QMap<QString, CAddress> parameters;
public:
   QVariant data(const QString& name);
   void setData(const QString& name, QVariant value);
   template<class C> void push(C& p, const QString& name = QString());
 
};
 
template<class C> void CInterface::push(C& ptr, const QString& name) {
   parameters[name] = CAddress(&ptr, QVariant(ptr).type());
}
Весь пример - в прикрепленном файле.
Записан

Qt 5.13.0 Qt Creator 4.10.2
Win7, Win10, Ubuntu 18.04
sergek
Хакер
*****
Offline Offline

Сообщений: 634


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #17 : Сентябрь 16, 2018, 21:36 »

А как вы в мапе тип сохраняете, в type_info?
QVariant::type()
Записан

Qt 5.13.0 Qt Creator 4.10.2
Win7, Win10, Ubuntu 18.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10603


Просмотр профиля
« Ответ #18 : Сентябрь 17, 2018, 07:04 »

Весь пример - в прикрепленном файле.
Все-таки цеплять наследованием не очень хорошо - структура может быть вообще "незнакома с Qt"  Улыбающийся Но в целом мне понравилось, спасибо

Вариант, предложенный ViTech, мне нравится. Но для него нужно иметь шпаргалку "0 -Temperature X", "1 - Temperature Y" и т.д., 50 штук.
Да, нужны enum'чики, по сути мы присваиваем каждому полю уникальное ID. Пусть его придется мапить в имя и обратно, но часто это имеет смысл, обращение по ID удобнее,  Ну и опять-таки, можно обойтись простейшими средствами, напр
Код
C++ (Qt)
QVariant GetParamByID( const ParameterRow & row, ParameterRow::TID ID )
{
switch (ID) {
 case  ParameterRow::id_Temperature:
  return row.temperature;
 
 case ParameterRow::id_Path:
  return row.path;
 
 case ParameterRow::id_Value:
  return row.someValue;
 
 default:
   Q_ASSERT(0);  // invalid ID
}
return 0;
}
 
Оформлять это в более общем виде (неизбежно раздувая, наворачивая код) - ну не знаю.. "Выйгрышь" конечно будет (если такие структуры идут бурным потоком), но насколько - хз. Спрячусь за стандартную фразу "зависит от задачи"  Улыбающийся
Записан
sergek
Хакер
*****
Offline Offline

Сообщений: 634


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #19 : Сентябрь 17, 2018, 09:34 »

Да, нужны enum'чики, по сути мы присваиваем каждому полю уникальное ID. Пусть его придется мапить в имя и обратно, но часто это имеет смысл, обращение по ID удобнее
А пожалуйста... (c) "И". В CInterface меняем QMap на вектор, в push вместо parameters[name] используем append, забываем name и городим enum  Подмигивающий Для красоты еще можно определить operator[].
Вообще-то в оригинальном варианте у меня используется вектор, поскольку вся конструкция используется для сериализации/десериализации объектов классов при передаче по сети (есть у меня библиотека удаленных вызовов процедур). Поэтому разыменования членов класса мне не требуется. Причем, для простых типов вычисление размера тоже очень простое: QMetaType(addr.type).sizeOf().
Записан

Qt 5.13.0 Qt Creator 4.10.2
Win7, Win10, Ubuntu 18.04
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2070



Просмотр профиля
« Ответ #20 : Сентябрь 17, 2018, 20:27 »

Предложения с name, кажется, не подходят. Используется 2 язычный интерфейс.

Сейчас ещё рассматриваю вариант не дешевле ли будет договориться сделать всё на виджетах...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2070



Просмотр профиля
« Ответ #21 : Сентябрь 17, 2018, 20:31 »

Ой. Сообразил. name это же имя в настройках Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2510

чтоб работа волком не казалась :)


Просмотр профиля WWW
« Ответ #22 : Сентябрь 19, 2018, 18:39 »

У QVariantMap главный плюс - автоматический поиск по ключу, без свитчей и лямд.
Поэтому мы делали подобную штуку именно через варианты.
Разве что надо обращать внимание на типы - у QVariant есть пересекающееся подмножество с QMetaInfo, а есть не пересекающееся (косяк Qt, мож когда починять...)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

http://sintegrial.com - всякий хороший Qt софт (был Грустный )
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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