Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: daimon от Май 16, 2011, 20:00



Название: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: daimon от Май 16, 2011, 20:00
Код
C++ (Qt)
#include "clistwidgetlegendgraph2d.h"
#include <QtGui/QApplication>
 
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(QRect(0,0,640,480));
 
CListLegend list(0);
list.addItems(QStringList()<<"sfdsdfshhhhhhhhhhhhhhhhdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf"<<"sfdsdfsdf"<<"sdf");
 
scene.addWidget(&list);
scene.addWidget(new QPushButton("button",0));
 
 
QPixmap pixmap(scene.sceneRect().width(),scene.sceneRect().height());
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
painter.end();
 
 
pixmap.save("scene.png","png");
 
QGraphicsView view(&scene);
view.show();
return a.exec();
}
Есть ли какая-то реализация компоновщика в сцене, чтобы норально расположить там виджеты и есть ли более адекватный рендеринг, чтобы не создавать пиксмеп с размером?
спс


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: m_ax от Май 16, 2011, 20:43
Имхо, но Вы похоже не по назначению используете сцену.

Смысл здесь в сцене?
Создайте обычный виджет и помещайте туда лайоут с теми виджетами, которые хотите скомпоновать.
Если нужно отрендерить его и сохранить, то у виджета есть такой метод render. Причём отрендерятся все виджеты, которые лежат на родителе.


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: daimon от Май 16, 2011, 20:52
Раскажите свой вариант с графиком на пальцах
если сделать просто виджетом с лейаутом не получится тогда сделать рендеринг в картинку размера больше виджета

просто у меня есть виджет графика там редреринг пиксмепа по заданному размеру - по рендерингу и идёт сохранение в картинку
если повесить виджет то как тогда сделать рендер этого виджета вместе с графиком?



Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: m_ax от Май 16, 2011, 21:20
Раскажите свой вариант с графиком на пальцах
если сделать просто виджетом с лейаутом не получится тогда сделать рендеринг в картинку размера больше виджета

просто у меня есть виджет графика там редреринг пиксмепа по заданному размеру - по рендерингу и идёт сохранение в картинку
если повесить виджет то как тогда сделать рендер этого виджета вместе с графиком?

У Вас же есть исходники LightPlot2D. Проще их посмотреть, чем на пальцах здесь пытаться объяснить.

Цитировать
если сделать просто виджетом с лейаутом не получится тогда сделать рендеринг в картинку размера больше виджета

просто у меня есть виджет графика там редреринг пиксмепа по заданному размеру - по рендерингу и идёт сохранение в картинку
если повесить виджет то как тогда сделать рендер этого виджета вместе с графиком?
Почему это не получится?
Посмотрите как реализован метод
Код
C++ (Qt)
QPixmap toPixmap(const QSize &s);
 
В lightplot2d.h

Всё должно получится, вот пример приаттачен:


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: m_ax от Май 16, 2011, 21:38
Цитировать
если сделать просто виджетом с лейаутом не получится тогда сделать рендеринг в картинку размера больше виджета
Аа.. Да, больше размер можно получить только ценой потери качества - просто растяжение (масштабирование).
Но и сцена Вам здесь не поможет.. наверное.. 


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: daimon от Май 16, 2011, 21:41
Цитировать
если сделать просто виджетом с лейаутом не получится тогда сделать рендеринг в картинку размера больше виджета
Аа.. Да, больше размер можно получить только ценой потери качества - просто растяжение (масштабирование).
Но и сцена Вам здесь не поможет.. наверное..  
Как я у вас увидел, вы вешаете просто виджет легенды на виджет графика
а во время рендеренга в картинку, рендерете график с грабом легенды (вызываете метод, который возвращает пиксмеп легенды)
Правильно ли я понял?
да и какой вариант теста либы скачивать под новую вашу либку?


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: m_ax от Май 16, 2011, 21:47
Цитировать
Как я у вас увидел, вы вешаете просто виджет легенды на виджет графика
а во время рендеренга в картинку, рендерете график с грабом легенды (вызываете метод, который возвращает пиксмеп легенды)
Правильно ли я понял?
Да, легенда имеет свой буфер, как и Plotter, и при рендеринге я просто накладываю на пиксмап plotter'а пиксмап легенды. Однако, я могу сделать размер готового изображения больше того, который имеет сам виджет.


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: m_ax от Май 16, 2011, 21:49
Цитировать
да и какой вариант теста либы скачивать под новую вашу либку?
Я бы не сказал, что она новая..
Скачивать нужно последний вариант (пост #100) в http://www.prog.org.ru/topic_10208_90.html


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: daimon от Май 16, 2011, 21:50
Цитировать
Как я у вас увидел, вы вешаете просто виджет легенды на виджет графика
а во время рендеренга в картинку, рендерете график с грабом легенды (вызываете метод, который возвращает пиксмеп легенды)
Правильно ли я понял?
Да, легенда имеет свой буфер, как и Plotter, и при рендеринге я просто накладываю на пиксмап plotter'а пиксмап легенды. Однако, я могу сделать размер готового изображения больше того, который имеет сам виджет.
у меня подобное, только рендер используется самим виджетом и пишется изображение в пиксмеп (размер зависит от размера окна), который и рисуется в пеинте
получается, если я реализую подобное, то у меня граб легенды будет рисоваться всё равно и будет распологаться под виджетом легенды. Мда довольно кривовато. Как бы такое подправить. Чо разные рендеринги написать?

Код
C++ (Qt)
void CPlotter2d::paintEvent(QPaintEvent * /* event */)
{
   QStylePainter painter(this);
 
painter.drawPixmap(0, 0,pixmap);// mg);*/
//refreshPixmap(opt_graph);
 
}
 
void CPlotter2d::resizeEvent(QResizeEvent * /* event */)
{
if(opt_graph.width_widget !=  this->size().width() || opt_graph.height_widget != this->size().height() )
{
opt_graph.width_widget = this->size().width();
opt_graph.height_widget = this->size().height();
 
pixmap= refreshPixmap(opt_graph);
}
 
//   refreshPixmap(opt_graph);
}


Название: Re: QGraphicsScene/View как прикрутить компановщик к сцене
Отправлено: m_ax от Май 16, 2011, 21:59
Я же говорил, что правильнее изначально использовать для таких дел QGraphicsScene/View.
Но вначале нужно разобраться что из себя представляет сцена и для чего её придумали.
Или, как вариант использовать уже готовые решения, если время поджимает.