Показывай как выводишь элемент в 2 раза увеличенный.
На вскидку, надо отказаться от непонятного увеличения элемента в 2 раза и просто рисовать сразу элемент нужного размера.
Показываю. Только это не чистый тест графических объектов. Это код, который заменяет всю центральную часть произвольного наследника от QMainWindow, на графичекскую + масштабирует преобразованную центральную часть в зависимости от размеров всего окна. И в нём есть проблемма с этим самым кэшем:
C++ (Qt)
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QtGui>
int g_cxWorld = 640;
int g_cyWorld = 480;
/*****************************************************************************/
class GraphicsView : public QGraphicsView
{
QGraphicsWidget *m_pgw;
int m_cxWorld, m_cyWorld;
public:
GraphicsView(QGraphicsScene *scene, int cxWorld=800, int cyWorld=600, QWidget *parent = 0) : QGraphicsView(scene,parent)
{
m_cxWorld = cxWorld;
m_cyWorld = cyWorld;
setAlignment( Qt::AlignLeft | Qt::AlignTop );
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing );// | QPainter::HighQualityAntialiasing | QPainter::NonCosmeticDefaultPen);
}
void SaveCurMainWidget( )
{
int n = scene()->items().size();
QGraphicsObject *pgo = scene()->items().at(0)->toGraphicsObject();
QGraphicsWidget *pgw = qobject_cast<QGraphicsWidget*>(pgo);
m_pgw = pgw;
// setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
}
virtual void resizeEvent(QResizeEvent *event)
{
double cx, cy;
double khw = double(event->size().height()) / double(event->size().width());
if( khw > (double(m_cyWorld)/double(m_cxWorld)) )
cy = m_cyWorld, cx = (cy/khw);
else
cx = m_cxWorld, cy = (cx*khw);
QGraphicsWidget *pgw = m_pgw;
pgw->setPos( 0,0 );
pgw->resize(cx+2,cy+2);
//pgw->setCacheMode(QGraphicsItem::ItemCoordinateCache);
pgw->setCacheMode(QGraphicsItem::ItemCoordinateCache,(pgw->boundingRect().size()*2).toSize());// pgw->setScale( .5 );
setSceneRect(0,0,cx,cy);
fitInView(sceneRect(), Qt::IgnoreAspectRatio);
}
};
void QMainWindow_SetCentralWidgetGraphics( QMainWindow *pw, int cxWorld=800, int cyWorld=600 )
{
QGraphicsScene *pscene = new QGraphicsScene( 0, 0, cxWorld, cyWorld, pw ), &scene = *pscene;
QWidget *pwc = pw->centralWidget();
GraphicsView *pview = new GraphicsView(&scene,cxWorld,cyWorld,pw);
pwc->setParent( NULL );
// добавляем центральный виджет к сцене
scene.addWidget(pwc);//,Qt::Window);
// устанавливаем новый центральный виджет в окне
pw->setCentralWidget( pview );
pview->SaveCurMainWidget();
}
/*****************************************************************************/
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QMainWindow_SetCentralWidgetGraphics( &w, 640, 480 );
w.show();
return a.exec();
}
проблемной является строчка:C++ (Qt)
pgw->setCacheMode(QGraphicsItem::ItemCoordinateCache,(pgw->boundingRect().size()*2).toSize());
Т.е. в этом коде нет масштаба именно в 2 раза, тут есть произвольное масштабирование в зависимости от размеров окна при помощи ф-ии fitInView, зато размер кэша устанавливается именно в 2 раза больше текущего размера.