Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: SpiritFire от Октябрь 12, 2009, 18:51



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

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

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


Название: Re: Подпись к линейке на графике
Отправлено: BRE от Октябрь 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" ) );
}
 


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

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

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

Эммм, вот совершенно же не понятно как и что Вы рисуете, задачка для телепатов, хотя бы скриншоты привели. Рискну предположить что все рисуется на одной сцене, тобишь в единых координатах с единой матрицей преобразования. Тогда как в данном случае шкалы нужно вообще отдельными виджетами делать, и при масштабировании, например, отрабатывать для них этот факт отдельно. Немного мутное объяснеие получилось, но я надеюсь понятно. А вообще советую посмотреть на архитектуру Qwt, покрайней мере для начала.


Название: Re: Подпись к линейке на графике
Отправлено: SpiritFire от Октябрь 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()


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



Название: Re: Подпись к линейке на графике
Отправлено: SpiritFire от Октябрь 13, 2009, 10:09
К сожалению, Qwt не катит, почитал мнения-отзывы, будет очень тяжело прикрутить то, что  нужно к нему. Проблема в том, что график весьма специфический - может быть "очень длинным" (не длинным, а очень длинным :)), с возможностью выделения, скролинга, гибкого масштабирования. При этом работать быстро. Посему было решено делать его самостоятельно, не используя сторонних библиотек.

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

Цитировать
Это я к тому, что бы ты попробовал сетку и подписи рисовать без масштабирования, а потом настраивать масштаб и рисовать график.
попробую, посмотрю, как будет. Проблема в том, что сетку-то надо в любом случае адекватную масштабу графика рисовать, грубо говоря так, чтобы было видно глазами, что при x=2 y=2x=4
То есть масштабировать придется в любом случае, только тут вручную.


Название: Re: Подпись к линейке на графике
Отправлено: SpiritFire от Октябрь 13, 2009, 11:39
Вероятно, остановлюсь на таком варианте, если делать так, как и начал, все одной кучей, то сетку буду рисовать с масштабированием, так меньше геммороя, а вот надписи - без. В любом случае у меня известна высота графика "в попугаях". Если сам график высотой 33 попугая, то по серединке на оси ординат можно не задумываясь писать 16.5 :)

*дописано:
Помню, обещал скриншот:


Название: Re: Подпись к линейке на графике
Отправлено: SLiDER от Октябрь 14, 2009, 00:00
Проблема в том, что график весьма специфический - может быть "очень длинным" (не длинным, а очень длинным :)),  

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

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

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

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

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

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

А вообще, я обратил Ваше внимание на эту библиотеку не для того что бы Вы не писали свою, а что бы вы посмотрели ее архетектуру, в частности шкалы в ней это вообще отдельные виджеты,