Поиск:

Ответ в темуСоздание новой темы Создание опроса
> несколько виджетов и одни данные 
:(
    Опции темы
daemonaz
Дата 13.5.2013, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Нужно создать многооконнное приложение MDI, в каждом окне размещены разные GUi-компоненты, изменение параметров или выбора пункта приводит к изменению одних и тех же данных, например, битов каких-то регистров, но при этом меняются отображения параметров с помошью хитрых вычислений в других окнах, хотлось бы совета какие стандартные классы qt4 использовать для написания такого рода приложения? На ум приходит архитектура модель-контроллер-вид, но посмотрел доку там используется для отображения данных стандартные класс QListView, QTableView и QTreeView, а у меня используются разные GUI-компоненты (QLineEdit, QComboBox), хотелось бы совета каким образом эффективно синхронизировать изменение данных и изменения отображения данных. Речь идет об изменении битовых составляющих регистров, которые потом записывается в микросхему, но для пользователя нужен доступный интерфейс со всеми удобствами. Спасибо
PM MAIL   Вверх
math64
Дата 13.5.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В принципе, QLineEdit и QComboBox можно заменить на QTableView размером 1x1 и делегатом, создающем при редактировании QLineEdit и QComboBox соответственно.
Но в принципе, делегатом (или по функционалу аналогичным классом) можно воспользоваться и без таблицы.
PM   Вверх
Guinness
Дата 13.5.2013, 16:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Возможно натолкнет на какие-нибудь мысли qt-manual. Также по нему вроде бы есть примеры.
Я на основе этого делал простенькое диалоговое окошко, для чего-то сложного не использовал.
PM MAIL   Вверх
Majestio
Дата 13.5.2013, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



Цитата(daemonaz @ 13.5.2013,  14:47)
хотелось бы совета каким образом эффективно синхронизировать изменение данных и изменения отображения данных. 

  1. Объявите модель данных, видимую всеми виджетами
  2. Все действия над моделью будут эмитировать сигнал  dataChanged, заставляя контролы, привязанные к этой модели, обновлять данные
  3. Для модификации данных модели разработайте набор делегатов
  4. Используйте совет выше, для привязки набора полей модели к виджетам

Я бы сделал так.
PM MAIL WWW   Вверх
math64
Дата 14.5.2013, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Ещё в Qt есть класс QDataWidgetMapper - позволяет связать содержимое одной строки таблицы с QLineEdit или другими виджетами.
PM   Вверх
daemonaz
Дата 14.5.2013, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Для уточнения, имеется группа 64-разрядных регистров (r1.. r8), из них в регистрах управления микросхемой каждый бит указывает режим работы, имеются также  регистры, содержащие данные, так вот можно в виде таблицы битов все это обрисовать, что я уже сделал на первых порах, там тупо бит выставляется и по нажатию кнопки данные записываются в ИМС, а можно сделать интерфейс, облегчающий конфигурирование регистров с выдачей ощибки и прочие прелести, то есть например, пользователь выбирает пункт из listwidget: mode 1, mode 2, mode 3, соответсвенно меняются 2 бита на 8 разряде регистра r1, при этом в другом окне в QLineEdit меняется формат ввода данных (кол-во нулей до и после запятых в числах с плавающей точкой) , а в третьем окне такая зависимость от этих битов приводит к вычислению по некой формуле и выдачей результата вычисления на экран. На ум приходит некая модель, в котором в качестве данных берутся регистры r, далее мне нужно как-то привязать номера битов и номера регистра к конкретному виджету, и в зависимости от изменения того или иного виджета меняются биты в регистрах, о чем сигнал dataChanged() оповещает другие виджеты об изменении, те в свою очередь тоже меняются. Не понятно как это связать классом QDataWidgetMapper?   
PM MAIL   Вверх
Majestio
Дата 14.5.2013, 13:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



Давайте рассуждать  smile 

1) Ваша микросхема - это одна сущность. Значить данные модели - регистры. Модель в реализации Qt - это двумерный массив. Как нам хранить регистры? Регистр в виде записи (record) не пойдет, т.к. регистры имеют разные размерности. Следовательно наша модель - однострочный массив, где поля записи - регистры.

2) Вы не определились с бизнес-логикой. Что именно вы хотите от программы?

3) Предположим обобщенный вариант. Некий интерфейс позволяет изменять часть регистров, и изменять условия (данные вне модели), а так же должен выводить состояние регистров, а так же другие характеристики (вне модели).

Простой пример

A1,A2, ... A128 - регистры данных
RES - регистр результата
OP - регистр операции

Один из вариантов бизнес логики операции "Сложение":

Если выбрана операция "сложение" поле OP, в регистр Результа RES заносится арифметическое сложение A1 и A2, в поле формы T выводится количество тактов, выполняемых процессором для осуществления данной операции. На форме I, указывающее количество итераций. На форме есть поле H, указывающее максимально развиваемую частоту работы процессора в результате выполнения итераций.

Смотрим:

OP,A1,A2 - регистры и мы можем их менять
RES - тоже регистр, но мы его менять не можем (контрол в ReadOnly)
T,H - это не регистр, это бизнес-логика (контрол в ReadOnly)
I - это не регистр, это бизнес-логика (можем редактировать)

4) Что нам сделать с полями, которых нет в модели? Думаю самое время опеделить модель-посредник (примерчик). Ее задача выбирать должным образом данные из основной модели, формировать и использовать "виртуальные/вычислимые" (вне основной модели) поля. И отдавать все это представлению. Конечно и брать от представления то, что может изменить данные основной модели.

5) QDataWidgetMapper как раз и свяжет прокси модель с представлением (формой).

Писал и рассуждал и для себя конечно, ибо сам еще такое не делал - но стало интересно, пошел бы по этому пути. smile 



Это сообщение отредактировал(а) Majestio - 14.5.2013, 13:13
PM MAIL WWW   Вверх
daemonaz
Дата 14.5.2013, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Majestio, спасибо большое! smile 
PM MAIL   Вверх
Majestio
Дата 14.5.2013, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



 smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.