Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение для редактирования массивов (Qt), Не знаю с чего начать 
:(
    Опции темы
htzg
Дата 18.2.2012, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток!
Хочу написать программку для работы (работаю я не программистом), но не знаю с чего начать.
Это программа редактирования 3-х мерных массивов.
Интерфейс должен выглядеть следующим образом:
1) слева список массивов;
2) справа 2D окно для отображения одного слоя 3D массива (каждое значение отображается как ячейка, как в IconEditor)
3) две кнопки(вверх и вниз) кнопки для перехода от одного слоя к другому.

Как сделать 2Д окно разобрался - QGraphicsVeiw, QGraphicsScene, QGraphicsPolygonItem.
Как сделать так что бы выбирая из списка массив что бы он отображался в 2Д окне.
Где должен храниться это массив?

Может у кого есть что то похожее? Что бы я сориентировался как построить структуру?

Спасибо!

п.с.: если что не понятно - спросите! Постараюсь детализировать.
PM MAIL   Вверх
borisbn
Дата 18.2.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



что хранится в каждой ячейке массива ?
откуда берутся данные для массивов ?
куда данные сохраняются после редактирования ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 18.2.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Данные для массива удобно хранить в дереве
x - номер колонки дерева
у - номер дочернего узла дерева
z - номер корневого узла дерева
Таким образом, не нужно переключаться между слоями.
Легко добавить ещё координату, увеличив уровень вложенности.
Для того, чтобы смотреть слои x-z и y-z можно использовать ProxyModel, переставляющую ячейки.
Сцену сделать так, чтобы она синхронизировалась с моделью дерева, а выделение на сцене - с выделением на дереве.

PM   Вверх
htzg
Дата 18.2.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(borisbn @ 18.2.2012,  10:58)
что хранится в каждой ячейке массива ?
откуда берутся данные для массивов ?
куда данные сохраняются после редактирования ?

в каждой ячейке храниться значение типа double. (при визуализации используется шкала)
данные считываются из текстового файла (один из возможных путей). Из этого же файла берется информация о размерности массива ijk.
после редактирования эти данные выгружаются в текстовый ascii файл. Так же нужно иметь для этого приложения save файл.

PM MAIL   Вверх
borisbn
Дата 18.2.2012, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(htzg @  18.2.2012,  01:43 Найти цитируемый пост)
1) слева список массивов;

Обычный QTableWidget

Цитата(htzg @  18.2.2012,  01:43 Найти цитируемый пост)
2) справа 2D окно для отображения одного слоя 3D массива

QTableView со своей моделью
В функции data() наследника при запросе Qt::DecorationRole в зависимости от значения double соответствующей ячейки генерится QPixmap с нужной шкалой.
Для редактирования ячейки устанавливается делегат


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
htzg
Дата 18.2.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Эксперт
****


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

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



Ещё координату z можно хранить по разным ролям: (Qt::UserRole+z), нужную роль для показа выбирает делегат.
Если размерность z небольшая, делегат может вывести все коондинаты в одной ячейке разными цветами.
(z=0 - красный, z=1 -зелёный, z=2 - синий и т.д.).
Для редактирования используется двухколоночный комбо-бокс (см. соседнюю тему),
первая колонка - значение z, не редактируемое, вторая колонка - значение, редактируемое.
PM   Вверх
htzg
Дата 18.2.2012, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(borisbn @  18.2.2012,  15:02 Найти цитируемый пост)
В функции data() наследника при запросе Qt::DecorationRole в зависимости от значения double соответствующей ячейки генерится QPixmap с нужной шкалой.

если ячейки не квадратные (геометрия ячеек тоже грузится). Они представляют из себя полигон с четырьмя углами.
PM MAIL   Вверх
math64
Дата 18.2.2012, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(htzg @  18.2.2012,  17:11 Найти цитируемый пост)
если ячейки не квадратные (геометрия ячеек тоже грузится). Они представляют из себя полигон с четырьмя углами

Покажите скрит-шот. Не  понятно зачем нужны ячейки в виде полигона - если нужен вывод трехмерной картинки, тогда форма делится на три части:
1) список таблиц (QTableView в QDockWidget слева, кроме названий здесь можно вываодить размености).
2) слой таблицы (QTableView в QDockWidget справа). Пользователь может открыть несколько слоёв и перетаскавать их так, как ему удобно.
3)В середине - трёхмерная картинка. Можно QGraphicsView, но он не очень приспособлен для трёхмерной графики.
Но Pixmap'ы, по моему, не нужны - это зряшная трата памяти. Делегаты должны отрисовывать полоски "на лету", без создания pixmap.
В составе Qt есть примеры отрисовки делегатом ячейки в виде прогресс-бара.

Добавлено через 11 минут и 4 секунды
PS: Если редактируется несколько таблиц, в середине - QMdiArea. При открытии таблицы создаётся QMdiSubWindow c QTableView или QGraphicsView.
PM   Вверх
htzg
Дата 18.2.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



user posted image
примерно вот что должно получиться.
Сетка - размерность массива и геометрия ячеек.
Массив - трехмерный массив с данными типа double. 
Справа 2Д окно. Отображается массив 2х3х10. Сейчас отображается один слой (допустим первый).
Еще правее стрелки для перехода от слоя к слою по направлению Z.
Массивы будут большими до 9999х9999х9999.
Правка массивов будет либо полигонами, либо кистью с определенным радиусом охвата ячеек. 
Значения можно умножать на какой нибудь коэф. или присваивать им значения. 
PM MAIL   Вверх
math64
Дата 18.2.2012, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Поскольку все ячейки прямоугольные - QGraphicsView не нужен.
Слева - дерево.
В центре - QTableView + делегат отрисовывающий ячейки. + модель выдающая данные для делегата (кроме значения - минимальное и максимальное значение, размеры ячеек и т.д.)
Модель - одна на всю таблицу (в виде дерева, но показывается таблица, слой выбирается с полощью setRootIndex(индекс слоя);
Справа - я бы вместо двух кнопок разместил QScrollBar или QSlider, можно даже ListView, показывающий индексы слоёв (т.е. модель та же, что и для центрального TableView, rootIndex указывает на корень дерева).

PM   Вверх
htzg
Дата 18.2.2012, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(math64 @ 18.2.2012,  19:56)
Поскольку все ячейки прямоугольные - QGraphicsView не нужен.
Слева - дерево.
В центре - QTableView + делегат отрисовывающий ячейки. + модель выдающая данные для делегата (кроме значения - минимальное и максимальное значение, размеры ячеек и т.д.)
Модель - одна на всю таблицу (в виде дерева, но показывается таблица, слой выбирается с полощью setRootIndex(индекс слоя);
Справа - я бы вместо двух кнопок разместил QScrollBar или QSlider, можно даже ListView, показывающий индексы слоёв (т.е. модель та же, что и для центрального TableView, rootIndex указывает на корень дерева).

отлично!
но ячейки могут быть не прямоугольные (хоть и редкий случай,1%). Вообще это поле свойств. Ячейка должна представлять замкнутый полигон с 4-мя точками. 

Это сообщение отредактировал(а) htzg - 18.2.2012, 22:53
PM MAIL   Вверх
math64
Дата 19.2.2012, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не обратил вчера внимание - размеры массивов слишком большие, в память не влезут.
Значит, нужно запоминать в файл или БД и подгружать по мере надобности.
При использовании  БД, возможно, будет работать слишком медленно, но писать свою модель не нужно - QSqlTableModel,
выбор слоя - setFilter(tr("z = %1").arg(z)); колонку z при показе можно скрыть.
При записи в двоичный файл будет быстрее(если хватит точности, лучше использовать float вместо double)
Нужный слой можно отобразить в память.

Если справа всё-таки хочешь разместить кнопки, можешь использовать QDataWidgetMapper (там предусмотрены 4 кнопки - на первую запись, на предыдущую, на следующую, на последнюю), но этой класс предназначен немного для других целей (для addMapping у тебя ничего нет, нужный слой придётся назначать в слоте, присоединённом к сигналу currentIndexChanged(int)

PM   Вверх
math64
Дата 19.2.2012, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



по отношению полигонов: всё-таки не понятно, когда нужна не прямоугольная ячейка. Делегат может отобразить внутри ячейки что угодно, в том числе и полигон с любым числом сторон, но всё это должно умещаться в прямоугольник.
При наведении мышки на ячейку может выскакивать ToolTip любой формы, для вывода туда изображения можно воспользоваться html, но лучше, чтобы появлялся свой виджет.
При открытии ячейки на редактирование можно использовать виджет, похожий на QComboBox, где в выпадяющем окне тоже можно вывести полигон.
Как выводить данные их модели в графическом виде - можешь посмотреть пример Chart из документации Qt (там выводятся значения в виде круговой диаграммы) или может быть найдётся что-то подходящее в QWT.

PM   Вверх
htzg
Дата 19.2.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



user posted image
вот какие могут быть ячейки.
Почему такие: это геологическое распределение свойств. Вообще размерность ячеек в реальных единицах измерения длинны(метры, футы и т.д.)
Чем меньше ячейки тем детальнее распределение. Когда сильная геологическая неоднородность появляются такие "кривые" ячейки.
По поводу размерности: я думаю можно для начала остановиться 1000^3. Для int хватит. 9999^3 - такое в состоянии тянуть симулятор,  для которого этот массив правится. Но на практике таких больших массивов не видел. Хотя от года к году они все прибавляют в размерах. В 99% случаев машина будет 64-битная. Если 32-битная машинка, то и массивы будут маленькие (на 32-битах большие сетки не посчитаешь, максимум ~1'000'000 ячеек). Если компилировать для 64-битов, это решает проблему нехватки памяти? Кстати, float меня вполне устроит.
Думаю вместо кнопок можно QSlider и ListView.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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