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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка вычисления видимой области???  (Прочитано 2791 раз)
alexman
Гость
« : Август 03, 2010, 00:00 »

Есть код:
Код:
#include <QtCore/QDebug>
#include <QtGui/QApplication>
#include <QtGui/QGraphicsItem>
#include <QtGui/QGraphicsScene>
#include <QtGui/QGraphicsView>

class GraphicsItem : public QGraphicsItem
{
public:
GraphicsItem() : QGraphicsItem() {}

QRectF boundingRect() const
{
return QRectF( 0, 0, 100, 100 );
}

void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget )
{
qDebug() << painter->worldTransform().inverted().mapRect( painter->viewport() );
qDebug() << ( (QGraphicsView*)widget->parent() )->mapToScene( painter->viewport() ).boundingRect();
}
};

int main( int argc, char** argv )
{
QApplication app( argc, argv );

GraphicsItem* item = new GraphicsItem();

QGraphicsScene scene;
scene.addItem( item );
scene.setSceneRect( item->boundingRect() );

QGraphicsView view;
view.setScene( &scene );

app.setActiveWindow( &view );
view.show();
view.resize( 300, 100 );

view.fitInView( scene.sceneRect() );

return app.exec();
}

Данный код выводит в консоли:
Код:
QRect(-1,-2 101x104) 
QRectF(-0.680272,-2.12766 101.361x104.255)

Должно быть QRectF(0,0 100x100). Никак не пойму почему область просмотра больше чем должно быть на самом деле?
Записан
alexman
Гость
« Ответ #1 : Август 03, 2010, 08:43 »

Добавил рисовку прямоугольника (см. рис):
Код:
#include <QtCore/QDebug>
#include <QtGui/QApplication>
#include <QtGui/QGraphicsItem>
#include <QtGui/QGraphicsScene>
#include <QtGui/QGraphicsView>

class GraphicsItem : public QGraphicsItem
{
public:
GraphicsItem() : QGraphicsItem() {}

QRectF boundingRect() const
{
return QRectF( 0, 0, 100, 100 );
}

void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget )
{
painter->drawRect( boundingRect() );
qDebug() << painter->worldTransform().inverted().mapRect( painter->viewport() );
qDebug() << ( (QGraphicsView*)widget->parent() )->mapToScene( painter->viewport() ).boundingRect();
}
};

int main( int argc, char** argv )
{
QApplication app( argc, argv );

GraphicsItem* item = new GraphicsItem();

QGraphicsScene scene;
scene.addItem( item );
scene.setSceneRect( item->boundingRect() );

QGraphicsView view;
view.setScene( &scene );

app.setActiveWindow( &view );
view.show();
view.resize( 300, 300 );

view.fitInView( scene.sceneRect() );

return app.exec();
}

Видно, что со всех сторон появляется зазор, который нах не нужен! Или я что-то не понимаю!?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Август 03, 2010, 10:30 »

в описании на QRect, написано, что по историческим причинам, он врёт на единицу.

Не знаю какаие могли быть исторические причины. Но мои раскопки в исходниках этого класса показали, что врёт ещё и документация. напутано с методами, которые врут, а которые не врут.
Записан

Юра.
alexman
Гость
« Ответ #3 : Август 03, 2010, 11:00 »

в описании на QRect, написано, что по историческим причинам, он врёт на единицу.

Не знаю какаие могли быть исторические причины. Но мои раскопки в исходниках этого класса показали, что врёт ещё и документация. напутано с методами, которые врут, а которые не врут.
Да тут не на единицу! По высоте получется больше чем на 1!
На первый взгляд элементарные вещи! Почему не правят непонятно Непонимающий
« Последнее редактирование: Август 03, 2010, 11:03 от alexman » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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