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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Объединение сцен  (Прочитано 13904 раз)
StatuS74
Гость
« Ответ #15 : Октябрь 26, 2011, 13:58 »

во засек... получается так что одна сцена ложится на другу сцену.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #16 : Октябрь 26, 2011, 14:44 »

мне кажется что этими действиями сцены как бы не объеденяюсться а заменяются
Чушь. И причём здесь вообще объединение Непонимающий Ведь делается простое последовательное наложение.

Вот тебе рабочий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QImage>
#include <QPainter>
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QGraphicsScene scene1, scene2, scene3;
 
scene1.setSceneRect( -250, -250, 500, 500 );
scene2.setSceneRect( -250, -250, 500, 500 );
scene3.setSceneRect( -250, -250, 500, 500 );
 
scene1.addRect( QRectF( -200, -200, 400, 400 ), QPen( Qt::black ), QBrush( Qt::green ) );
scene2.addEllipse( -150, -150, 300, 300, QPen( Qt::black ), QBrush( Qt::red ) );
 
QGraphicsItem* pi = scene3.addRect(
QRectF( -50, -50, 100, 100 ), QPen( Qt::black ), QBrush( Qt::blue ) );
pi->setRotation( 45 );
 
QImage img( 800, 600, QImage::Format_RGB32 );
img.fill( QColor( Qt::white ).rgb() );
 
QPainter p( &img );
p.setRenderHint( QPainter::Antialiasing );
 
scene1.render( &p );
scene2.render( &p );
scene3.render( &p );
 
img.save( "/tmp/test.png" );
 
return 0;
}
 

Ещё раз повторяю, что на второй сцене есть либо элемент, который перекрывает всю сцену либо выставлен QGraphicsScene::backgroundBrush() либо перегружен QGraphicsScene::drawBackground(), который затирает фон.
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #17 : Октябрь 26, 2011, 14:48 »

да у меня есть  scene->setBackgroundBrush(Qt::black);
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #18 : Октябрь 26, 2011, 14:51 »

да у меня есть  scene->setBackgroundBrush(Qt::black);
Ну и чего спрашивается ты тогда удивляешься результату Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #19 : Октябрь 27, 2011, 07:02 »

убрал все заливки фона но все равно такая фигня что один на другой накладывается =(

« Последнее редактирование: Октябрь 27, 2011, 07:05 от StatuS74 » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #20 : Октябрь 27, 2011, 07:32 »

убрал все заливки фона но все равно такая фигня что один на другой накладывается =(
Ты это типа прикалываешься?
А ты разве не этого хотел?
Или всё-таки хотел, чтобы графики располагались один под другим?
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #21 : Октябрь 27, 2011, 07:55 »

я имел в виду что бы один под другим был
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #22 : Октябрь 27, 2011, 10:17 »

я имел в виду что бы один под другим был
Особенно это видно из первого сообщения
Цитировать
есть 2 сцены их надо сохранить одним графиком.
А прочитать описание QGraphicsScene::render() никак значит Непонимающий
Мде, слов нет... Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #23 : Октябрь 27, 2011, 10:33 »

я читал про это. одно не понятно. там не указано как совмешать сцены. судя приму который там есть я могу манипулировать только с одной сценой.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #24 : Октябрь 27, 2011, 10:41 »

я читал про это. одно не понятно. там не указано как совмешать сцены. судя приму который там есть я могу манипулировать только с одной сценой.
Скоро матом начну ругаться...
Ещё раз внимательно читаем описание QGraphicsScene::render():
Цитировать
void QGraphicsScene::render ( QPainter * painter, const QRectF & target = QRectF(), const QRectF & source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio )

Отображает прямоугольник сцены source в target используя painter. Эта функция полезна для записи содержимого сцены в устройство рисования, такое как QImage (например, сделать снимок экрана), или для печати в QPrinter. Например:

 QGraphicsScene scene;
 scene.addItem(...
 ...
 QPrinter printer(QPrinter::HighResolution);
 printer.setPaperSize(QPrinter::A4);

 QPainter painter(&printer);
 scene.render(&painter);

Если source это пустой прямоугольник, эта функция будет использовать sceneRect() для определения что ей отрисовывать. Если target это пустой прямоугольник, то будут использованы размеры устройства рисования painter.

Содержимое прямоугольника источника будет преобразовано в соответствии с aspectRatioMode для размещения в прямоугольнике назначения. По-умолчанию соотношение сторон сохраняется, а source масштабируется чтобы размещаться в target.
Так вот target - это область в картинке куда будет отрисовываться сцена.
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #25 : Октябрь 27, 2011, 11:07 »

понимаю что всех достал уже, но подскажите компилятор ругается что не те значения указываю.

Код:
 scene->render( &p, QRectF (80,0 ));
 scene2->render( &p , QRectF (80,301));
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #26 : Октябрь 27, 2011, 11:11 »

Под рукой есть ассистент?
Что написано в описании конструктора QRectF?
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #27 : Октябрь 27, 2011, 11:13 »

ааа координаты верхнего угла задавать 2 точками надо и нижнего также =)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #28 : Октябрь 27, 2011, 11:45 »

Вот тебе ещё рабочий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QImage>
#include <QPainter>
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QGraphicsScene scene1, scene2, scene3;
 
scene1.addRect( QRectF( -200, -200, 400, 400 ), QPen( Qt::black ), QBrush( Qt::green ) );
scene2.addEllipse( -200, -200, 400, 400, QPen( Qt::black ), QBrush( Qt::red ) );
 
QGraphicsItem* pi = scene3.addRect(
QRectF( -150, -150, 300, 300 ), QPen( Qt::black ), QBrush( Qt::blue ) );
pi->setRotation( 45 );
 
QImage img( 500, 1400, QImage::Format_RGB32 );
img.fill( QColor( Qt::white ).rgb() );
 
QPainter p( &img );
p.setRenderHint( QPainter::Antialiasing );
 
scene1.render( &p, QRectF( 50, 50, 400, 400 ) );
scene2.render( &p, QRectF( 50, 500, 400, 400 ) );
scene3.render( &p, QRectF( 50, 950, 400, 400 ) );
 
img.save( "/tmp/test.png" );
 
return 0;
}
 
Ежели и после него будут вопросы, то уже не ко мне, ибо надоело...
Записан

Qt 5.11/4.8.7 (X11/Win)
StatuS74
Гость
« Ответ #29 : Октябрь 27, 2011, 11:59 »

Спасибо тебе за помощь. я сделал вот так. все работает класс

Код:
 QImage img(scene->width(), scene2->height()*2.5, QImage::Format_RGB32);
                img.fill(QColor(Qt::black).rgb());
                QPainter p( &img );

                scene->render( &p, QRectF (0,img.height()/20,img.width(),img.height()/2));
                scene2->render( &p, QRectF (0,img.height()/2,img.width(),img.height()/2));

                p.end();
                img.save(QString("/Graphic_test/%1.PNG").arg(serial1_1));

Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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