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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Что у меня не так с трансформациями?  (Прочитано 13574 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Октябрь 31, 2016, 22:21 »

Надо вращать и одновременно масштабировать QGraphicsItem. Вращение с помощью item->setRotation(angle) без проблем. Но масштабировать надо только по одному размеру (конкретно по высоте), а почему-то item->setScale(scale) только по обоим размерам пропорционально. Нет варианта item->setScale(scaleX, scaleY). Попытался сделать с помощью item->setTransformations(transformationsList). Получается какая-то ерунда.

Код:
    QGraphicsRotation rotator;
    rotator.setOrigin(QVector3D(item->mapToScene(itemOriginQPointF)));
    QGraphicsScale scaler;
    scaler.setOrigin(QVector3D(item->mapToScene(itemOriginQPointF)));
    qDebug()<<item->mapToScene(itemOriginQPointF);
    qreal angle = ............
    rotator.setAngle( angle );
    qDebug()<<angle;
    qreal scale = ...........
    scaler.setYScale( scale );
    qDebug()<<scale;
    qDebug()<<rotator.origin()<<rotator.angle()<<scaler.origin()<<scaler.yScale();
и вывод...
Код:
QPointF(575,220)
49.0028
0.754266
QVector3D(575, 220, 0) -10.9972 QVector3D(575, 220, 0) 1
И как же работать с этим? Разумеется, после item->setTransformations() ни вращение, ни масштабирование не верные.
« Последнее редактирование: Ноябрь 01, 2016, 21:34 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 31, 2016, 23:08 »

В документации по QTransform есть примеры с одновременным rotate и scale.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Октябрь 31, 2016, 23:40 »

В документации по QTransform есть примеры с одновременным rotate и scale.

Там примеры другие, для paintEvent. И QTransform я так понял несколько для другого. Он не айтемы вращает и масштабирует, а системы координат. Я пробовал и им тоже - с первого раза отдельный айтем как надо повернуть и изменить не получилось. Крутит и масштабирует, но совершенно не так, как я ожидаю.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Октябрь 31, 2016, 23:45 »

Готовьте матрицу трансформаций и устанавливайте ее через
void QGraphicsItem::setTransform(const QTransform &matrix, bool combine = false)
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Октябрь 31, 2016, 23:51 »

Готовьте матрицу трансформаций и устанавливайте ее через
void QGraphicsItem::setTransform(const QTransform &matrix, bool combine = false)


Я так и сделал, получил не то вращение и масштабирование, которое ожидал.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Октябрь 31, 2016, 23:59 »

Я так и сделал, получил не то вращение и масштабирование, которое ожидал.
Пришлось встать и сесть за компьютер. Улыбающийся

Код
C++ (Qt)
#include "widget.h"
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsSimpleTextItem>
#include <QVBoxLayout>
 
Widget::Widget( QWidget *parent ) :
QWidget( parent ),
m_view( new QGraphicsView( this ) )
{
QVBoxLayout *l = new QVBoxLayout;
l->addWidget( m_view );
setLayout( l );
 
QGraphicsScene *scene = new QGraphicsScene( this );
m_view->setScene( scene );
 
QGraphicsSimpleTextItem *item0 = new QGraphicsSimpleTextItem( tr( "Test string" ) );
scene->addItem( item0 );
 
QGraphicsSimpleTextItem *item1 = new QGraphicsSimpleTextItem( tr( "Test string" ) );
item1->setPos( 0, 20 );
item1->setTransform( QTransform().scale( 2, 1 ).rotate( 45 ) );
scene->addItem( item1 );
}
 
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Ноябрь 01, 2016, 00:04 »

И вас совершенно не смущает, что текст искажён???  Обеспокоенный
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Ноябрь 01, 2016, 00:07 »

И вас совершенно не смущает, что текст искажён???  Обеспокоенный
Эээ чем искажен? И текст совершенно не причем, итем с текстом я выбрал только потому, что мне было лень искать картинку для примера. Улыбающийся
Здесь элемент повернут и отмаштабирован.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Ноябрь 01, 2016, 00:16 »

Пропорции текста изменились. Он стал "наклонным". Если ровный исходный текст увеличить и повернуть, буквы должны остаться перпендикулярными их основанию. А здесь они получились под углом к основанию. То есть, кроме масштабирования и поворота, получилось ещё и изменение соотношения сторон айтема. А мне не нужны искажения айтемов.

Текст вот так примерно должен выглядеть после изменений:

« Последнее редактирование: Ноябрь 01, 2016, 00:19 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Ноябрь 01, 2016, 00:26 »

Так?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Ноябрь 01, 2016, 00:29 »

Ну типа да
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Ноябрь 01, 2016, 00:30 »

Ну типа да
Код
C++ (Qt)
item1->setTransform( QTransform().rotate( 45 ).scale( 2, 1 ) );
 
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Ноябрь 01, 2016, 00:41 »

Ну у меня примерно также...

Код:
    item->setTransform(QTransform().translate(rotationCenter.x(),rotationCenter.y()).
                       rotate(angle).scale(scaleX,scaleY).translate(-rotationCenter.x(),-rotationCenter.y()));

В результате при поворотах на большие углы айтем сильно искажается.

Красная стрелка в исходном состоянии направлена вверх, и совершенно симметрична вдоль своей оси. А вот что с ней происходит при поворотах влево и вправо:

« Последнее редактирование: Ноябрь 01, 2016, 00:57 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Ноябрь 01, 2016, 00:56 »

В результате при поворотах на большие углы айтем сильно искажается.
Большие углы это какие? И что у вас за итем, как он искажается? Если можно со скриншотами.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Ноябрь 01, 2016, 00:59 »

См. выше. На айтеме лежит QWidget - это стрелка. Другого пути нет потому что так надо. Если я меняю местами вращение и масштабирование, айтем тоже искажается, но в другую сторону.

Если использовать item->setRotation() и item->setScale(), то всё шикарно крутится как надо, но масштабируется по X и Y одновременно. А мне надо только длину стрелки изменить.

Если менять размеры QWidget, то ничего не происходит, очевидно фальш-айтем вычисляет размеры только при привязке виджета.

Хотя... надо ещё раз проверить...
« Последнее редактирование: Ноябрь 01, 2016, 01:05 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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