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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подпись к линейке на графике  (Прочитано 5568 раз)
SpiritFire
Гость
« : Октябрь 12, 2009, 18:51 »

Помогите пожалуйста, делаю виджет, отображающий график произвольной функции, и вроде все Ок. Одна загвоздка: линия графика есть, сетка есть, автоматическое масштабирование есть, а как сделать подписи к делениям (на оси Х и У) - ума не приложу. QPaint::drawText просто выводит что-то неясное, размазанный первый символ - и все. Думаю, основная проблема в масштабировании, но опыта в кутях нет, ни куда копать - не пойму, ни  что смотреть. Хелпа начитался до тошноты - все равно, что не напишу - ничего не выводится... Стойкое чувство, что туплю, смотрб детали, а общую идею, как пользоваться не понял.

Скажите, пожалуйста, каким образом решается подобная задача, куда смотреть, что копать?

ЗЫ. Вообще проблем с Qt при том, что изучаю второй рабочий день, не было. Но работа с текстом и масштабируемые QPen-ы (особенно их стиль и кисть) -- это [CENSORED]... Начитался, что это чудо инженерной мысли ввели в Qt 4, "чтобы упростить работу с кистями". Вот упростили...
Записан
BRE
Гость
« Ответ #1 : Октябрь 12, 2009, 21:41 »

Попробуй такой код:
Код
C++ (Qt)
void paintEvent( QPaintEvent * )
{
QPainter p( this );
p.save(); // сохранили состояние рисовальщика
 
// настроили вывод графика + нарисовали график
p.rotate( 45 );
p.scale( 2, 2 );
p.drawEllipse( QRect( 100, 10, 200, 100 ) );
p.drawText( QPoint( 100, 10 ), tr( "Test str" ) );
 
p.restore(); // восстановили (или настроили заново) состояние рисовальщика
// нарисовали подписи
p.drawText( QPoint( 100, 10 ), tr( "Test str" ) );
}
 
Записан
SLiDER
Гость
« Ответ #2 : Октябрь 12, 2009, 21:49 »

Помогите пожалуйста, делаю виджет, отображающий график произвольной функции, и вроде все Ок. Одна загвоздка: линия графика есть, сетка есть, автоматическое масштабирование есть, а как сделать подписи к делениям (на оси Х и У) - ума не приложу. QPaint::drawText просто выводит что-то неясное, размазанный первый символ - и все. Думаю, основная проблема в масштабировании, но опыта в кутях нет, ни куда копать - не пойму, ни  что смотреть. Хелпа начитался до тошноты - все равно, что не напишу - ничего не выводится... Стойкое чувство, что туплю, смотрб детали, а общую идею, как пользоваться не понял.

Скажите, пожалуйста, каким образом решается подобная задача, куда смотреть, что копать?

ЗЫ. Вообще проблем с Qt при том, что изучаю второй рабочий день, не было. Но работа с текстом и масштабируемые QPen-ы (особенно их стиль и кисть) -- это [CENSORED]... Начитался, что это чудо инженерной мысли ввели в Qt 4, "чтобы упростить работу с кистями". Вот упростили...

Эммм, вот совершенно же не понятно как и что Вы рисуете, задачка для телепатов, хотя бы скриншоты привели. Рискну предположить что все рисуется на одной сцене, тобишь в единых координатах с единой матрицей преобразования. Тогда как в данном случае шкалы нужно вообще отдельными виджетами делать, и при масштабировании, например, отрабатывать для них этот факт отдельно. Немного мутное объяснеие получилось, но я надеюсь понятно. А вообще советую посмотреть на архитектуру Qwt, покрайней мере для начала.
Записан
SpiritFire
Гость
« Ответ #3 : Октябрь 12, 2009, 23:04 »

задачка для телепатов,
Извините, действительно так - вечером убегал с работы, торопился и недосмотрел.

Как рисую:
Есть шаблонный метод класса вижета "class GraphRender : public QGLWidget"
Код:
template <typename Functor>
void recreate(Functor func)
{
    m_pointsArray = func();
    ... // доп. данные, минимум-максимум на промежутке [xMin; xMax] и др.
    repaint();
}

В обработчике paintEvent(...) что делаю:
1. выбираю сплошную кисть цвета фона.
2. рисую рамку, заполненную фоном
3. убираю кисть
4. вычисляю максимально возможным масштаб при данных размерах окна
5. ставлю масштаб
6. ставкю pen размером ( абсолютная ширина / масштаб ) для того, чтобы ширина пера не масштабировалась
7. отрисовываю painter.drawPolyLine(m_pointsArray);
8. отрисовываю сетку (как лист в клеточку)
Далее собираюсь отрисовывать надписи на сетке.

Все индет одним painter-ом.

PS. Ушел гуглить на тему Qwt, заодно опробую предложенный вариант, подумаю, почему у меня подоное не проходило. Может, из-за отсутствия .restore()
Записан
BRE
Гость
« Ответ #4 : Октябрь 13, 2009, 07:43 »

PS. Ушел гуглить на тему Qwt, заодно опробую предложенный вариант, подумаю, почему у меня подоное не проходило. Может, из-за отсутствия .restore()
Это я к тому, что бы ты попробовал сетку и подписи рисовать без масштабирования, а потом настраивать масштаб и рисовать график.

Записан
SpiritFire
Гость
« Ответ #5 : Октябрь 13, 2009, 10:09 »

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

Цитировать
Рискну предположить что все рисуется на одной сцене, тобишь в единых координатах с единой матрицей преобразования
Можете рассказать, пожалуйста, какая есть альтернатива? Я считал, что одна форма (канва, виджет) - одна сцена. Пребраования, насколько видел, накладываются к пеинтеру.

Цитировать
Это я к тому, что бы ты попробовал сетку и подписи рисовать без масштабирования, а потом настраивать масштаб и рисовать график.
попробую, посмотрю, как будет. Проблема в том, что сетку-то надо в любом случае адекватную масштабу графика рисовать, грубо говоря так, чтобы было видно глазами, что при x=2 y=2x=4
То есть масштабировать придется в любом случае, только тут вручную.
« Последнее редактирование: Октябрь 13, 2009, 10:11 от SpiritFire » Записан
SpiritFire
Гость
« Ответ #6 : Октябрь 13, 2009, 11:39 »

Вероятно, остановлюсь на таком варианте, если делать так, как и начал, все одной кучей, то сетку буду рисовать с масштабированием, так меньше геммороя, а вот надписи - без. В любом случае у меня известна высота графика "в попугаях". Если сам график высотой 33 попугая, то по серединке на оси ординат можно не задумываясь писать 16.5 Улыбающийся

*дописано:
Помню, обещал скриншот:
« Последнее редактирование: Октябрь 13, 2009, 12:46 от SpiritFire » Записан
SLiDER
Гость
« Ответ #7 : Октябрь 14, 2009, 00:00 »

Проблема в том, что график весьма специфический - может быть "очень длинным" (не длинным, а очень длинным Улыбающийся),  

А в точках это сколько ? И на какой машине ? В принципе на четвертом пне мне вполне удавалось в реальном времени  выводить пару сотен тысячь точек, больше небыло необходимости.

с возможностью выделения, скролинга, гибкого масштабирования.

Все это в Qwt есть.

При этом работать быстро. Посему было решено делать его самостоятельно, не используя сторонних библиотек.

Не факт что после реализации всего выше перечисленного Ваша реализация получится быстрее.

Цитировать
Можете рассказать, пожалуйста, какая есть альтернатива? Я считал, что одна форма (канва, виджет) - одна сцена. Пребраования, насколько видел, накладываются к пеинтеру.

А вообще, я обратил Ваше внимание на эту библиотеку не для того что бы Вы не писали свою, а что бы вы посмотрели ее архетектуру, в частности шкалы в ней это вообще отдельные виджеты,
« Последнее редактирование: Октябрь 14, 2009, 00:03 от SLiDER » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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