v2.0ではコンポーザ、v3.0ではレイアウトと呼称しているようです。
両者で多少用途が違うのかもしれません。
以下では、画像でエクスポートする例を示します。
v2.x
1: 2: // コンポジションの設定 3: QgsMapRenderer *pRenderer = mapCanvas->mapRenderer(); 4: QgsComposition composition( pRenderer ); 5: composition.setPlotStyle( QgsComposition::Print ); 6: composition.setPrintResolution( 254 ); 7: 8: // 紙サイズを設定 9: QSize sizeCanvas = mapCanvas->size(); 10: sizeCanvas *= sizeCanvas.width() > sizeCanvas.height() ? 11: 200.0/sizeCanvas.width() : 200.0/sizeCanvas.height(); 12: 13: // ラベルを書き込む範囲を追加 14: sizeCanvas.rheight() += 25.0; 15: composition.setPaperSize( sizeCanvas.width(), sizeCanvas.height() ); 16: 17: // マップアイテムを作成 18: QgsComposerMap composerMap( &composition, 0, 0, sizeCanvas.width(), sizeCanvas.height() ); 19: // アイテム内のマップキャンバスの表示範囲を再設定 20: composerMap.setNewExtent( mapCanvas->extent() ); 21: // マップアイテムをコンポジションに追加 22: composition.addItem( &composerMap ); 23: 24: // ラベルアイテムを作成 25: QgsComposerLabel label( &composition ); 26: label.setText( "何かテキスト" ); 27: // テキストがHTMLで記述されていて、マークアップを反映したい場合 28: label.setHtmlState( 1 ); 29: // フォント 30: QFont font( "Sans", 6 ); 31: label.setFont( font ); 32: // 位置を指定してコンポジションに追加 33: label.setSceneRect( QRectF( 0, 200, 200, 25 ) ); 34: composition.addItem( &label ); 35: 36: // エクスポート画像を作成 37: int nDpi = composition.printResolution(); 38: double dDpm = nDpi / 25.4; 39: int nWidth = int( dDpm * composition.paperWidth() ); 40: int nHeight = int( dDpm * composition.paperHeight() ); 41: QImage img( QSize( nWidth, nHeight ), QImage::Format_ARGB32 ); 42: img.setDotsPerMeterX( dDpm * 1000 ); 43: img.setDotsPerMeterY( dDpm * 1000 ); 44: img.fill( Qt::white ); 45: 46: // エクスポート画像にコンポジションの内容をレンダリング 47: QPainter painter( &img ); 48: QRectF rcSource( 0, 0, composition.paperWidth(), composition.paperHeight() ); 49: QRectF rcTarget( 0, 0, nWidth, nHeight ); 50: composition.render( &painter, rcTarget, rcSource ); 51: painter.end(); 52: 53: // 画像を保存 54: img.save( strFName, "png" );
2016年4月追記
画像で保存するところで便利な関数がありました。
上記コードの36行目以降は以下のようにたった2行でよさそうです。
QImage img = composition.printPageAsRaster( 0 );
img.save( strFName, "png" );
エクスポート画像にワールドファイルを付加するには
エクスポート画像に対応したワールドファイルを付けるための便利な関数もあります。
以下のようにします。
composition.setGenerateWorldFile( true ); double daWld[6]; composition.computeWorldFileParameters ( daWld[0], daWld[1], daWld[2], daWld[3], daWld[4], daWld[5] );
あとは、取得した6つの値を順に1行ずつテキストに保存します。
v3.x
1: // create composition 2: // ポインタで生成しかできない。 3: // QGraphicsScene::QGraphicsScene(const QGraphicsScene &)': 関数は明示的に削除されました 4: QgsPrintLayout *pLayout = new QgsPrintLayout( QgsProject::instance() ); 5: pLayout->initializeDefaults(); 6: pLayout->setUnits( QgsUnitTypes::LayoutMillimeters ); 7: 8: // set paper size 9: QgsLayoutPageCollection *pCol = pLayout->pageCollection(); 10: QgsLayoutItemPage *pPage = pCol->pages()[0]; 11: QSize sizeCanvas = centralwidget->size(); 12: sizeCanvas *= 200.0 / sizeCanvas.width(); 13: pPage->setPageSize( QgsLayoutSize(sizeCanvas) ); 14: 15: // add a map to the composition 16: QgsLayoutItemMap *pMap = new QgsLayoutItemMap( pLayout ); 17: pMap->setRect( QRectF(0, 0, sizeCanvas.width(), sizeCanvas.height()) ); 18: pMap->setPos( 0, 0 ); 19: pMap->setExtent( centralwidget->extent() ); 20: pMap->attemptSetSceneRect( QRectF( 0, 0, sizeCanvas.width(), sizeCanvas.height() ) ); 21: pLayout->addItem( pMap ); 22: 23: // add label 24: QgsLayoutItemLabel *pLabel = new QgsLayoutItemLabel( pLayout ); 25: pLabel->setText( "test" ); 26: pLabel->setMode( QgsLayoutItemLabel::ModeHtml ); 27: QFont font( "Sans", 18 ); 28: pLabel->setFont( font ); 29: pLabel->setPos( sizeCanvas.width() / 2.0, 0 ); 30: pLabel->setHAlign( Qt::AlignHCenter ); 31: pLabel->adjustSizeToText(); 32: pLayout->addItem( pLabel ); 33: 34: // add frame 35: QgsLayoutItemShape *pFrame = new QgsLayoutItemShape( pLayout ); 36: pFrame->attemptSetSceneRect( QRectF(10.0, 10.0, sizeCanvas.width() - 20.0, sizeCanvas.height() - 20.0) ); 37: pFrame->setShapeType( QgsLayoutItemShape::Rectangle ); 38: QgsStringMap mapFrameProp; 39: mapFrameProp["outline_color"] = "255,255,0"; 40: mapFrameProp["outline_width"] = "1.0"; 41: mapFrameProp["style"] = "no"; 42: QgsFillSymbol *psymbolFrame = QgsFillSymbol::createSimple( mapFrameProp ); 43: pFrame->setSymbol( psymbolFrame ); // オーナー移動せず クローン作製される 44: pLayout->addItem( pFrame ); 45: delete psymbolFrame; 46: 47: // create output image and initialize it 48: QgsLayoutExporter exporter = QgsLayoutExporter( pLayout ); 49: QString strWldFName = QFileInfo( strFName ).completeBaseName() + ".wld"; 50: exporter.georeferenceOutput( strWldFName ); 51: QgsLayoutExporter::ImageExportSettings settings; 52: settings.generateWorldFile = true; 53: settings.imageSize = sizeCanvas * 10; 54: exporter.exportToImage( strFName, settings ); 55: 56: delete pLayout;