![]() |
|
|
![]()
|
|
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
Доброго времени суток!
Хочу написать программку для работы (работаю я не программистом), но не знаю с чего начать. Это программа редактирования 3-х мерных массивов. Интерфейс должен выглядеть следующим образом: 1) слева список массивов; 2) справа 2D окно для отображения одного слоя 3D массива (каждое значение отображается как ячейка, как в IconEditor) 3) две кнопки(вверх и вниз) кнопки для перехода от одного слоя к другому. Как сделать 2Д окно разобрался - QGraphicsVeiw, QGraphicsScene, QGraphicsPolygonItem. Как сделать так что бы выбирая из списка массив что бы он отображался в 2Д окне. Где должен храниться это массив? Может у кого есть что то похожее? Что бы я сориентировался как построить структуру? Спасибо! п.с.: если что не понятно - спросите! Постараюсь детализировать. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
что хранится в каждой ячейке массива ?
откуда берутся данные для массивов ? куда данные сохраняются после редактирования ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Данные для массива удобно хранить в дереве
x - номер колонки дерева у - номер дочернего узла дерева z - номер корневого узла дерева Таким образом, не нужно переключаться между слоями. Легко добавить ещё координату, увеличив уровень вложенности. Для того, чтобы смотреть слои x-z и y-z можно использовать ProxyModel, переставляющую ячейки. Сцену сделать так, чтобы она синхронизировалась с моделью дерева, а выделение на сцене - с выделением на дереве. |
|||
|
||||
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
в каждой ячейке храниться значение типа double. (при визуализации используется шкала) данные считываются из текстового файла (один из возможных путей). Из этого же файла берется информация о размерности массива ijk. после редактирования эти данные выгружаются в текстовый ascii файл. Так же нужно иметь для этого приложения save файл. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Обычный QTableWidget QTableView со своей моделью В функции data() наследника при запросе Qt::DecorationRole в зависимости от значения double соответствующей ячейки генерится QPixmap с нужной шкалой. Для редактирования ячейки устанавливается делегат -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
Спасибо большое!
Буду переваривать пока! |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Ещё координату z можно хранить по разным ролям: (Qt::UserRole+z), нужную роль для показа выбирает делегат.
Если размерность z небольшая, делегат может вывести все коондинаты в одной ячейке разными цветами. (z=0 - красный, z=1 -зелёный, z=2 - синий и т.д.). Для редактирования используется двухколоночный комбо-бокс (см. соседнюю тему), первая колонка - значение z, не редактируемое, вторая колонка - значение, редактируемое. |
|||
|
||||
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
||||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Покажите скрит-шот. Не понятно зачем нужны ячейки в виде полигона - если нужен вывод трехмерной картинки, тогда форма делится на три части: 1) список таблиц (QTableView в QDockWidget слева, кроме названий здесь можно вываодить размености). 2) слой таблицы (QTableView в QDockWidget справа). Пользователь может открыть несколько слоёв и перетаскавать их так, как ему удобно. 3)В середине - трёхмерная картинка. Можно QGraphicsView, но он не очень приспособлен для трёхмерной графики. Но Pixmap'ы, по моему, не нужны - это зряшная трата памяти. Делегаты должны отрисовывать полоски "на лету", без создания pixmap. В составе Qt есть примеры отрисовки делегатом ячейки в виде прогресс-бара. Добавлено через 11 минут и 4 секунды PS: Если редактируется несколько таблиц, в середине - QMdiArea. При открытии таблицы создаётся QMdiSubWindow c QTableView или QGraphicsView. |
|||
|
||||
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
![]() примерно вот что должно получиться. Сетка - размерность массива и геометрия ячеек. Массив - трехмерный массив с данными типа double. Справа 2Д окно. Отображается массив 2х3х10. Сейчас отображается один слой (допустим первый). Еще правее стрелки для перехода от слоя к слою по направлению Z. Массивы будут большими до 9999х9999х9999. Правка массивов будет либо полигонами, либо кистью с определенным радиусом охвата ячеек. Значения можно умножать на какой нибудь коэф. или присваивать им значения. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Поскольку все ячейки прямоугольные - QGraphicsView не нужен.
Слева - дерево. В центре - QTableView + делегат отрисовывающий ячейки. + модель выдающая данные для делегата (кроме значения - минимальное и максимальное значение, размеры ячеек и т.д.) Модель - одна на всю таблицу (в виде дерева, но показывается таблица, слой выбирается с полощью setRootIndex(индекс слоя); Справа - я бы вместо двух кнопок разместил QScrollBar или QSlider, можно даже ListView, показывающий индексы слоёв (т.е. модель та же, что и для центрального TableView, rootIndex указывает на корень дерева). |
|||
|
||||
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
отлично! но ячейки могут быть не прямоугольные (хоть и редкий случай,1%). Вообще это поле свойств. Ячейка должна представлять замкнутый полигон с 4-мя точками. Это сообщение отредактировал(а) htzg - 18.2.2012, 22:53 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Не обратил вчера внимание - размеры массивов слишком большие, в память не влезут.
Значит, нужно запоминать в файл или БД и подгружать по мере надобности. При использовании БД, возможно, будет работать слишком медленно, но писать свою модель не нужно - QSqlTableModel, выбор слоя - setFilter(tr("z = %1").arg(z)); колонку z при показе можно скрыть. При записи в двоичный файл будет быстрее(если хватит точности, лучше использовать float вместо double) Нужный слой можно отобразить в память. Если справа всё-таки хочешь разместить кнопки, можешь использовать QDataWidgetMapper (там предусмотрены 4 кнопки - на первую запись, на предыдущую, на следующую, на последнюю), но этой класс предназначен немного для других целей (для addMapping у тебя ничего нет, нужный слой придётся назначать в слоте, присоединённом к сигналу currentIndexChanged(int) |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
по отношению полигонов: всё-таки не понятно, когда нужна не прямоугольная ячейка. Делегат может отобразить внутри ячейки что угодно, в том числе и полигон с любым числом сторон, но всё это должно умещаться в прямоугольник.
При наведении мышки на ячейку может выскакивать ToolTip любой формы, для вывода туда изображения можно воспользоваться html, но лучше, чтобы появлялся свой виджет. При открытии ячейки на редактирование можно использовать виджет, похожий на QComboBox, где в выпадяющем окне тоже можно вывести полигон. Как выводить данные их модели в графическом виде - можешь посмотреть пример Chart из документации Qt (там выводятся значения в виде круговой диаграммы) или может быть найдётся что-то подходящее в QWT. |
|||
|
||||
| htzg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.4.2010 Репутация: нет Всего: нет |
![]() вот какие могут быть ячейки. Почему такие: это геологическое распределение свойств. Вообще размерность ячеек в реальных единицах измерения длинны(метры, футы и т.д.) Чем меньше ячейки тем детальнее распределение. Когда сильная геологическая неоднородность появляются такие "кривые" ячейки. По поводу размерности: я думаю можно для начала остановиться 1000^3. Для int хватит. 9999^3 - такое в состоянии тянуть симулятор, для которого этот массив правится. Но на практике таких больших массивов не видел. Хотя от года к году они все прибавляют в размерах. В 99% случаев машина будет 64-битная. Если 32-битная машинка, то и массивы будут маленькие (на 32-битах большие сетки не посчитаешь, максимум ~1'000'000 ячеек). Если компилировать для 64-битов, это решает проблему нехватки памяти? Кстати, float меня вполне устроит. Думаю вместо кнопок можно QSlider и ListView. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, 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. |