![]() |
|
![]() ![]() ![]() |
|
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Нужно создать многооконнное приложение MDI, в каждом окне размещены разные GUi-компоненты, изменение параметров или выбора пункта приводит к изменению одних и тех же данных, например, битов каких-то регистров, но при этом меняются отображения параметров с помошью хитрых вычислений в других окнах, хотлось бы совета какие стандартные классы qt4 использовать для написания такого рода приложения? На ум приходит архитектура модель-контроллер-вид, но посмотрел доку там используется для отображения данных стандартные класс QListView, QTableView и QTreeView, а у меня используются разные GUI-компоненты (QLineEdit, QComboBox), хотелось бы совета каким образом эффективно синхронизировать изменение данных и изменения отображения данных. Речь идет об изменении битовых составляющих регистров, которые потом записывается в микросхему, но для пользователя нужен доступный интерфейс со всеми удобствами. Спасибо
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
В принципе, QLineEdit и QComboBox можно заменить на QTableView размером 1x1 и делегатом, создающем при редактировании QLineEdit и QComboBox соответственно.
Но в принципе, делегатом (или по функционалу аналогичным классом) можно воспользоваться и без таблицы. |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Возможно натолкнет на какие-нибудь мысли qt-manual. Также по нему вроде бы есть примеры.
Я на основе этого делал простенькое диалоговое окошко, для чего-то сложного не использовал. |
|||
|
||||
Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Я бы сделал так. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Ещё в Qt есть класс QDataWidgetMapper - позволяет связать содержимое одной строки таблицы с QLineEdit или другими виджетами.
|
|||
|
||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Для уточнения, имеется группа 64-разрядных регистров (r1.. r8), из них в регистрах управления микросхемой каждый бит указывает режим работы, имеются также регистры, содержащие данные, так вот можно в виде таблицы битов все это обрисовать, что я уже сделал на первых порах, там тупо бит выставляется и по нажатию кнопки данные записываются в ИМС, а можно сделать интерфейс, облегчающий конфигурирование регистров с выдачей ощибки и прочие прелести, то есть например, пользователь выбирает пункт из listwidget: mode 1, mode 2, mode 3, соответсвенно меняются 2 бита на 8 разряде регистра r1, при этом в другом окне в QLineEdit меняется формат ввода данных (кол-во нулей до и после запятых в числах с плавающей точкой) , а в третьем окне такая зависимость от этих битов приводит к вычислению по некой формуле и выдачей результата вычисления на экран. На ум приходит некая модель, в котором в качестве данных берутся регистры r, далее мне нужно как-то привязать номера битов и номера регистра к конкретному виджету, и в зависимости от изменения того или иного виджета меняются биты в регистрах, о чем сигнал dataChanged() оповещает другие виджеты об изменении, те в свою очередь тоже меняются. Не понятно как это связать классом QDataWidgetMapper?
|
|||
|
||||
Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Давайте рассуждать
![]() 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 как раз и свяжет прокси модель с представлением (формой). Писал и рассуждал и для себя конечно, ибо сам еще такое не делал - но стало интересно, пошел бы по этому пути. ![]() Это сообщение отредактировал(а) Majestio - 14.5.2013, 13:13 |
|||
|
||||
daemonaz |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Majestio, спасибо большое!
![]() |
|||
|
||||
Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |