Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: alexman от Август 03, 2010, 00:00



Название: Ошибка вычисления видимой области???
Отправлено: 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). Никак не пойму почему область просмотра больше чем должно быть на самом деле?


Название: Re: Ошибка вычисления видимой области???
Отправлено: alexman от Август 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();
}

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


Название: Re: Ошибка вычисления видимой области???
Отправлено: lit-uriy от Август 03, 2010, 10:30
в описании на QRect, написано, что по историческим причинам, он врёт на единицу.

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


Название: Re: Ошибка вычисления видимой области???
Отправлено: alexman от Август 03, 2010, 11:00
в описании на QRect, написано, что по историческим причинам, он врёт на единицу.

Не знаю какаие могли быть исторические причины. Но мои раскопки в исходниках этого класса показали, что врёт ещё и документация. напутано с методами, которые врут, а которые не врут.
Да тут не на единицу! По высоте получется больше чем на 1!
На первый взгляд элементарные вещи! Почему не правят непонятно ???