C++ (Qt)#ifndef __RESIZEGVIEW_H__#define __RESIZEGVIEW_H__ #include <QGraphicsScene>#include <QGraphicsView>#include <QGraphicsProxyWidget>#include <QTimer> class CResizeGView : public QGraphicsView{ Q_OBJECT; QWidget * m_pWidget; QTimer m_tmDoResize; public: CResizeGView( QWidget * parent = 0 ) : QGraphicsView( parent ) { m_pWidget = 0; m_tmDoResize.setSingleShot( true ); m_tmDoResize.setInterval( 500 ); QObject::connect( &m_tmDoResize, SIGNAL(timeout()), this, SLOT(doResize()) ); } virtual ~CResizeGView() {} void setWidget( QWidget * pWidget ) { m_pWidget = pWidget; } private: virtual void resizeEvent ( QResizeEvent * pEvent ) { m_tmDoResize.start(); } private slots: void doResize() { double fdW = (double)( size().width()-10 ) / (double)(m_pWidget->size().width()); double fdH = (double)( size().height()-10 ) / (double)(m_pWidget->size().height()); resetTransform(); scale( fdW, fdH ); }}; #endif // __RESIZEGVIEW_H__
C++ (Qt)void showScaledWidget( QWidget * pWidget, bool bFullScreen, bool bScaled, int nScreenNum, QGraphicsScene * & pGScene, QGraphicsView * & pGView ){ QWidget * pParentSCR = QApplication::desktop()->screen( nScreenNum ); if ( bScaled ) { pGScene = new QGraphicsScene(); pGScene->addWidget( pWidget ); CResizeGView * pResizeGView = new CResizeGView( pParentSCR ); pResizeGView->setScene( pGScene ); pGView = pResizeGView; // возвращаем указатель на созданный объект для удаления в вызывающем коде //**************************** код ускорения через OpenGL ***************************************** // QGLWidget удалять отдельно не нужно - удалится сам при удалении pGView //pGView->setViewport( new QGLWidget(QGLFormat(QGL::SampleBuffers)) );//**************************** код ускорения через OpenGL ***************************************** pResizeGView->setGeometry( pWidget->geometry() ); pResizeGView->setWidget( pWidget ); // View-у нужен доступ к геометрии виджета для правильного ресайза pResizeGView->setWindowTitle( pWidget->windowTitle() ); if ( bFullScreen ) pGView->showFullScreen(); else pGView->show(); } else { pWidget->setParent( pParentSCR ); if ( bFullScreen ) pWidget->showFullScreen(); else pWidget->show(); };}