Russian Qt Forum
Июля 02, 2025, 04:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Объединение сцен  (Прочитано 15928 раз)
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.039 секунд. Запросов: 20.