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

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

Страниц: 1 2 3 [4] 5 6 7   Вниз
  Печать  
Автор Тема: Light Plot2D  (Прочитано 61827 раз)
daimon
Гость
« Ответ #45 : Июнь 27, 2010, 15:53 »

Данные- модель таблицы (я пока только под QTableWidget сижу)
Потом создать кнопку построения графика-при нажатии диалог c такими кнопками добавить и удалить кривую, и следовательно там выбор колонок под х y (из таблицы)

qt commercial 4.5.0 VS2008

код кому надо выложу!
Она только начальная:
очень много проблем с реализацией.

Проблемы:
1. таблица - модель, где хранить данные таблицы (контейнер или постоянно считывать из файла)...для меня самая важная

Я думаю надо начинать с таблицы в таких проетах!!!

« Последнее редактирование: Июнь 27, 2010, 16:03 от daimon » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #46 : Июнь 27, 2010, 16:46 »

Данные- модель таблицы (я пока только под QTableWidget сижу)
Потом создать кнопку построения графика-при нажатии диалог c такими кнопками добавить и удалить кривую, и следовательно там выбор колонок под х y (из таблицы)

Я думаю надо начинать с таблицы в таких проетах!!!

Я думаю, мы думаем о разном))

LightPlot2D - это оболочка (интерфейс) для Plotter'а (изначально наз. AbstractPlot2D). Создан для удобства редактирования данных, т.е. тех данных, которые Plotter в себе содержит.
О том где и как брать эти данные (CurveData) это уже решает сам разработчик.
Интерфейс LightPlot2D и без того слишком навязан, и самое главное сохранить баланс между удобством редактирования и навязанным интерфейсом (не переборщить не туды - ни сюды)  Смеющийся

Кстати, у меня не запускается ваша Demo.exe  Грустный
Не из-за того, что у меня Линь (у меня и хрень тож есть, ворованная, тока тссс))), а  она (Qt, не windows) собрана мингвшным компилятором. Вы бы тогда и dll предоставили в таком случае или сразу исходники..
    
« Последнее редактирование: Июнь 27, 2010, 17:15 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
daimon
Гость
« Ответ #47 : Июнь 27, 2010, 19:00 »

Я Вас понял, просто меня интерисует именно вопрос по модели
и как Вы составили класс настроек графика?

код
« Последнее редактирование: Июнь 27, 2010, 19:39 от daimon » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #48 : Июнь 27, 2010, 20:42 »

Я Вас понял, просто меня интерисует именно вопрос по модели
и как Вы составили класс настроек графика?

Что-то я не соображу, что именно имеется ввиду под классом настроек графика?
Есть класс CurveData, который содержит информацию о кривой: цвет, символ, легенда ... ну и сами данные, которые представимы как QVector<QPointF> _data
Если Вам нужно отображать данные из таблицы (у меня просто все данные высчитываются в отдельном потоке и уже автоматически посылаются в plotter, но эт так..)  создаёте соответствующую модель (две колонки "x", "y"), данные в млдели я бы хранил в том же QVector<QPointF> и сделал бы метод, который бы возвращал этот вектор. Затем создаёте объект CurveData:
Код
C++ (Qt)
QVector<QPointF> data = yourModel->vectorOfPoints(); // QVector<PointF>
CurveData cd(data, "curve 1");
lightPlot2D->plotter->setCurveData(cd);
 
   
Всё...
Мы друг друга понимаем?  Улыбающийся

Да, у меня что-то не собирается Ваш проект.. куча ворнингов и код ошибки 3 (не знаю, что бы это могло значить)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
daimon
Гость
« Ответ #49 : Июнь 27, 2010, 21:05 »

Я Вас понял, просто меня интерисует именно вопрос по модели
и как Вы составили класс настроек графика?

Что-то я не соображу, что именно имеется ввиду под классом настроек графика?
Есть класс CurveData, который содержит информацию о кривой: цвет, символ, легенда ... ну и сами данные, которые представимы как QVector<QPointF> _data
Если Вам нужно отображать данные из таблицы (у меня просто все данные высчитываются в отдельном потоке и уже автоматически посылаются в plotter, но эт так..)  создаёте соответствующую модель (две колонки "x", "y"), данные в млдели я бы хранил в том же QVector<QPointF> и сделал бы метод, который бы возвращал этот вектор. Затем создаёте объект CurveData:
Код
C++ (Qt)
QVector<QPointF> data = yourModel->vectorOfPoints(); // QVector<PointF>
CurveData cd(data, "curve 1");
lightPlot2D->plotter->setCurveData(cd);
 
 
Всё...
Мы друг друга понимаем?  Улыбающийся

Да, у меня что-то не собирается Ваш проект.. куча ворнингов и код ошибки 3 (не знаю, что бы это могло значить)
просто генерил про файлы Visual Studio 2008

через некоторое время выложу весь проект под Visual Studio 2008 с qt dll 4.5.0
« Последнее редактирование: Июнь 27, 2010, 21:09 от daimon » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #50 : Июнь 30, 2010, 14:51 »

Приветствую!

Выкладываю третью альфа версию. Что нового:
1) Для легенды реализована буферизация;
2) Исправлен мелкий недочёт:
2. если нет кривых,остается след от легенды - пустой квадрат (наверное нужно убирать в этом случае)
3) И тому подобные крошки на кровати))

Best regards, m_ax  Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Karl-Philipp
Гость
« Ответ #51 : Июнь 30, 2010, 15:40 »

1. Если увеличивать масштаб графика из верхнего левого квадрата сетки - никаких действий не происходит (ни прямоугольника выделения, ни увеличения масштаба фрагмента графика).

2. Игрался с графиком и как-то при развернутом на весь экран окне программы график уменьшился до четверти размера плота и оказался в левом верхнем углу. Вот только воспроизвести это никак не могу))

Qt 4.6.1, Windows 7
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #52 : Июнь 30, 2010, 15:51 »

1. Если увеличивать масштаб графика из верхнего левого квадрата сетки - никаких действий не происходит (ни прямоугольника выделения, ни увеличения масштаба фрагмента графика).

2. Игрался с графиком и как-то при развернутом на весь экран окне программы график уменьшился до четверти размера плота и оказался в левом верхнем углу. Вот только воспроизвести это никак не могу))

Qt 4.6.1, Windows 7

Спасибо за баги))

1) подправлено))
2) Интересно) Над тож будет поиграться))

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Karl-Philipp
Гость
« Ответ #53 : Июнь 30, 2010, 16:09 »

Не знаю, можно ли считать это багом)) но заметил, что при увеличении масштаба не до конца прорисовывается график.
« Последнее редактирование: Июнь 30, 2010, 16:12 от terlan » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #54 : Июнь 30, 2010, 16:59 »

terlan
Ваши замечания оч ценны)

Да, такое есть, но это не баг - эт следствие оптимизации. Дело в том, что при масштабировании для отображения кривой точки заносятся в QPolygonF:
Код
C++ (Qt)
if (show) {
           const QVector<QPointF> &data = cd.data();
           QPolygonF polyline;
 
           foreach(QPointF p, data) {
               double x = a11 * p.x() + a12;
               double y = a21 * p.y() + a22;
               if ((p.x() >= _curScaleX.min()) &&
                   (p.x() <= _curScaleX.max()))
                   polyline << QPointF(x, y);
           }
 
и заносятся лишь те точки, которые лежат в пределах minX <= x <= maxX. Так вот, если расстояние между точками окажется больше, возникнет показанный Вами эффект.
Я сейчас подправил это дела, просто раздвинув диапазон: minX-width*0.25 <= x <= 0.25 * width + maxX
Код
C++ (Qt)
if (show) {
           const QVector<QPointF> &data = cd.data();
           QPolygonF polyline;
 
           foreach(QPointF p, data) {
               double x = a11 * p.x() + a12;
               double y = a21 * p.y() + a22;
               if ((p.x() >= _curScaleX.min() - 0.25*_curScaleX.width()) &&
                   (p.x() <= _curScaleX.max() + 0.25*_curScaleX.width()))
                   polyline << QPointF(x, y);
           }
 


Стало лучше, но при дальнейшем увеличении масштаба это всё равно проявляется.. Просто не хочется в лоб все точки запихивать в polyline  Грустный

Если предложите вариант лучше, буду благодарен))

Спасибо) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
_Vitaliy_
Гость
« Ответ #55 : Июнь 30, 2010, 20:25 »

Отслеживаю Ваше "творение", нужное дело делаете.
Нескромный вопрос: не планируете ли Вы добавить возможность перетаскивания графика? т.е. при наведении на график и при нажатом каком-нибудь модификаторе (пусть к примеру будет Alt) можно было перетаскивать один из графиков функций например по оси ОУ.

З.ы. Один из вариантов применения, когда графиков необходимо выводить более 10-15 при этом у многих графиков свои размерности оси ОУ поэтому удобно их комбинировать для удобства, путем временного перемещения оси ОУ.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #56 : Июль 01, 2010, 11:00 »

Цитировать
З.ы. Один из вариантов применения, когда графиков необходимо выводить более 10-15 при этом у многих графиков свои размерности оси ОУ поэтому удобно их комбинировать для удобства, путем временного перемещения оси ОУ.

Если я правильно понял, то такая штука уже есть. График перемещается при нажатии на клавиши ←↑→↓.

З.ы. Более 10-15 графиков.. Это для каких практических применений?)) С таким числом кривых вся информативность и полезность, на мой взгляд, быстро улетучится)   
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #57 : Июль 01, 2010, 12:27 »

Итак, что заметил в версии которую вы приаттачили в посте №54

Собирал в WinXP Pro SP3 + Qt SDK 2009.04 (т.е. Qt 4.5.3)

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

2. Я не понял как после манипуляций с зумом, перемещением и т.п. графика сделать так чтобы вновь просмотреть его первоначальное положение.

3. Хорошо бы сделать так чтобы при перемещении курсора (да и не только при перемещении) - центр курсора пересекали две перпендикулярные тонкие линии (по горизонтали и вертикали) и двигарись вместе с центром курсора. Типа мишени Улыбающийся

4. Нужно обязательно сделать документацию к исходникам (сделать коментарии в стиле доксигена к примеру), которая включала бы:
 - описание каждого класса и модуля, т.е. зачем он , его функции и т.п.
 - описание каждого метода интерфейса класса
 - примеры использования
 - и т.п.

 А то я открыл исходники - а там пусто! А разбираться что зачем времени нет.

5. При перемещении курсора по графику в некоторых местах графика курсор меняет свой вид с "+" на "руку" . Я не знаю, баг это или нет.
6. Зачем перемещать график бесконечно влево/вправо/вверх/вниз если у него в исходных данных (массивы координат) есть ограничения!!!???
Имхо, нужно сделать возможность перемещения ТОЛЬКО если график не помещается! При этом должны быть пределы перемещения, ограниченными начальными и конечными значениями массивов координат. Имхо.

7. Циферки текущего значения координат (которые изменяются при изменении положения курсора) можно было бы также привязать к "прозрачному виджету" который был бы "привязан" к курсору и перемещался синхронно с ним.  

8. Также  заметил что в тех местах графика где курсор становится "рука" - пропадают цифирки координат!!!

9. При увеличении масштаба графика почему-то линии и точки графика исчезают!! Я понимаю конечно, что ножно больше точек для детализации - НО должна быть экстраполяция!! Имхо.

То же и относится к графикам в виде маркеров - точек (например красный график). Если я его детализирую - то почему то растут расстояния между точками составляющими график! Этого не должно быть.
Нужно сделать так - что как бы я не детализировал график (даже и в нормельном/исходном  его виде без масштаба) - расстояния между точками не должны меняться!

---

Вот, пока все! Улыбающийся

 

« Последнее редактирование: Июль 01, 2010, 12:29 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
_Vitaliy_
Гость
« Ответ #58 : Июль 01, 2010, 12:45 »

Цитировать
График перемещается при нажатии на клавиши ←↑→↓.
З.ы. Более 10-15 графиков.. Это для каких практических применений?)) С таким числом кривых вся информативность и полезность, на мой взгляд, быстро улетучится)
Правильно Вы заметили ВЕСЬ график функций, а хотелось бы возможность каждого по отдельности графика функции.
Есть такая игра ФлайтЖир (опен сорс симулятор полетов) так вот, в ней есть возможность сохранять в файл параметры полета, т.е. высоту, скорость, перегрузки (3 шт.), ручки (3 шт.), курс, крен, тангаж, и еще куча авиационной ерунды :-)...
Весь полет, порядка 40-50 мин (если частота опроса 4 раза в секунду) может достигать несколько десятков тысяч строк параметров (за один опрос одна строка всех значений параметров). Все это надо выводить на графике в одном окне. Поэтому было бы удобно накладывать график переменной на другой график... Надеюсь пояснил...
З.ы. есть еще ряд тонкостей но я их опускаю за ненадобностью.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #59 : Июль 01, 2010, 15:48 »

День добрый)

kuzulis
Спасибо за Ваши замечания)

1) Это известный баг) В версии 4.6.2 троли его уже пофиксили. Это возникает из-за того, что на QToolTip повешен Style sheet. Если закомментировать в файле lightplot2d.css следующую штуку:
Код
CSS
QToolTip {
background-color: rgb(200,200,255);
   border-color: darkslategray;
   border-width: 1px;
   border-style: solid;
   padding: 3px;
   font: bold;
   /*border-radius: 3px;*/
   opacity: 200;
}
 
 
то баг пропадёт.

2) Если использовался только лишь зум, то Ctrl +, Ctrl - вернёт всё в изначальное состояние.
Ежели использовалось перемещение графика, то никак))

3) Сделано ( слот void showCross(bool show); )

4) Да, это верно, сейчас работаю над этим. (правда в TeXе, потом в pdf конвертну)

5) Исправлено

6) Думаю Вы правы.. Возьму на заметку))

7) Циферки отображаются на QLabel, а её можно воткнуть куда угодно. Т.е. у plotterа есть метод
Код
C++ (Qt)
void setCurrentPointLabel(QLabel *label);
 
 
в который передаётся указатель на QLabel, в котором и отображается текущие координаты.

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

9) Не совсем согласен. А вот мне нужно отображать экспериментальные данные. Я их отображаю символами (кружочками, крестиками и т.п.) И когда я изменю масштаб,  по вашей логике, я должен добавлять новые точки.. Это мне не нужно((
Или же, что если данные в принципе не ложатся на плавную кривую?
В общем не знаю.. Я делал по идеологии Origina и QtiPlot, если эти проекты Вам известны.

_Vitaliy_
Цитировать
Правильно Вы заметили ВЕСЬ график функций, а хотелось бы возможность каждого по отдельности графика функции.
Есть такая игра ФлайтЖир (опен сорс симулятор полетов) так вот, в ней есть возможность сохранять в файл параметры полета, т.е. высоту, скорость, перегрузки (3 шт.), ручки (3 шт.), курс, крен, тангаж, и еще куча авиационной ерунды :-)...
Весь полет, порядка 40-50 мин (если частота опроса 4 раза в секунду) может достигать несколько десятков тысяч строк параметров (за один опрос одна строка всех значений параметров). Все это надо выводить на графике в одном окне. Поэтому было бы удобно накладывать график переменной на другой график... Надеюсь пояснил...
З.ы. есть еще ряд тонкостей но я их опускаю за ненадобностью.
Тогда появляется необходимость создания нескольких осей OY..
И тогда думать, как привязывать конкретную кривую к конкретной оси. Мой опыт показывает, что такие кренделя обычно не очень информативны и народ старается избегать ситуаций, где требуется отображать более двух масштабов по оси Y.

Спасибо исчо раз за участие. Вечерком выложу исходники..

Ауфидерзэйн)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 2 3 [4] 5 6 7   Вверх
  Печать  
 
Перейти в:  


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