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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Класс для хранения данных  (Прочитано 2179 раз)
vorotislav
Гость
« : Январь 15, 2015, 09:47 »

Доброго времени суток.
Господа, прошу помощи в создании класса для хранения данных.
Поясню ситуацию.
Пишу программу, для работы с ком-портом. В самом простом варианте, это выглядит так. Приходит пакет данных, в котором указывается группа контроллеров (в числовом виде), и говорится что с контроллера под таким адресом считать значение lineEdit.
Есть xml файл, где хранятся все типы контроллеров (в текстовом виде), список контроллеров для указанного типа и у каждого контроллера свой адрес.
Есть виджет окна, в котором есть два QListWidget. В первом выбирается тип контроллеров (на данный момент в текстовом виде, обычный список), при клике на этот тип, из файла загружаются все контроллеры указанного типа. и так же выстраивается третья часть окна, где для каждого типа подгружаются свои вкладки. При клике по контроллеру, во вкладку общие записывается адрес. Как это выглядит визуально - прикреплю два файла.
Вся правая часть ( с вкладками) создаётся в куче и всегда мы к ней имеем доступ.
Достаточно запутано, но пока идей для оптимизации нет.
Теперь, что мне необходимо. По идее, все lineEdit'ы должны быть доступны всегда, хоть на чтение хоть на запись, чтобы в зависимости от команды из пакеты, я смогу считать\записать данные.
Не могу придумать, как связать каждый виджет с группой контроллеров, их адресами и данными.
То есть, проблему вижу так:
Пришел пакет, я побайтно его разбираю. Байт под номером 3 (для примера) содержит номер группы. Байт №4 команду чтение. Байт №5 - адрес контроллера. Байт №6 - считать данные какого либо lineEdit. На этом этапе, я уже должен обратиться к нужному мне виджету, и знать что считывать. Буду рад любой идее или совету.
Если что-то не понятно, готов ответить на любые вопросы.
Записан
Bepec
Гость
« Ответ #1 : Январь 15, 2015, 10:14 »

1) не мешать ui и логику работы.
У вас есть протокол, в котором есть команды. Вот его вы описываете и продолжаете работать.
2) у вас есть ui.
Но единовременно может быть активной только одна вкладка. Потому остальные можно вообще создавать динамически при переключении.
3) класс для хранения данных должен хранить данные. Можно даже просто в виде класса хранящего пакет с методами, позволяющими получить находящиеся в пакете данные.
4) класс вообще не привязан должен быть к виджетам и не знать о их существовании. Вывесить у него только пару сигналов вроде "изменилось состояние" и "всё плохо".
5) у вас какой бред написан в части про запись/чтение. Или же бред в вашем протоколе. Тут уже надо поднимать протокол и смотреть по нему, а не по сбивчивому пояснению Улыбающийся

PS если у вас программа может записывать/считывать данные, она будет работать в роли мастера. Если же она подчиняется кому то на линии, то в роли слейва (раба Улыбающийся). Но тут опять таки протокол смотреть надо.
Записан
vorotislav
Гость
« Ответ #2 : Январь 15, 2015, 11:11 »

Верес, спасибо.
Я поэтому и написал сюда, потому что понял, что перемудрил, и смешал логику и интерфейс.
Программа вообще должна имитировать собственно контроллеры. То есть есть некое устройство, которое работает с кучей контроллеров. И опрашивает их состояние, или же говорит изменять что-либо. Вот эту кучу контроллеров и пытаюсь сэмулировать. Если я правильно Вас понял, что мне нужно будет написать классы, для хранения данных на каждый тип контроллеров, а для каждого конкретного контроллера создавать объект класса. И в каждом классе хранить данные всех edit'ов. Правильно? И в получается, можно сделать у класса свойство, которое возвращает адрес. То есть, после получения команды, опрашиваю все объекты нужного класса, получая их адрес, после того как нашел нужный, изменяю в нём данные, и уже в методе испускаю сигнал. чтобы виджет обновил информацию. А как можно привязать класс (типа контроллеров) с группой контроллеров из протокола? Может так же хранить свойством и группу, а в методе разбора пакета через банальный свитч?
Записан
Bepec
Гость
« Ответ #3 : Январь 15, 2015, 11:49 »

Ну общий принцип вы поняли, но повторюсь - тут уже надо смотреть на деле, протокол, его возможности. И уже по нему строить архитектуру.

Ибо протоколы бывают разные, умные, глупые, простые, хитрые. Есть ли цикл опроса, порядок запроса данных и прочая и прочая.

Вы спокойно можете создать класс контроллера, имеющего список устройств, привязанных к нему. И написать менеджер, который будет разруливать ваши ситуации вроде:
 нужно на 9 устройство отправить "бебебе".
И вы не задумываясь пишете sendString(9, "бебебе") и проверяете результат - а там уже по кодам ошибок получаете либо "передано", либо "устройство с таким адресом не найдено и прочая".

PS могу дать платную консультацию Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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