📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 328行目: | 328行目: | ||
<br> | <br> | ||
以下の例では、度単位の数値を度分秒表記にしている。<br> | 以下の例では、度単位の数値を度分秒表記にしている。<br> | ||
<br> | |||
まず、<code>QwtScaleDraw</code>クラスを継承した派生クラスを作成する。<br> | まず、<code>QwtScaleDraw</code>クラスを継承した派生クラスを作成する。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
| 383行目: | 384行目: | ||
この時、大きい数値は指数型の文字列を返す。<br> | この時、大きい数値は指数型の文字列を返す。<br> | ||
指数型の文字列を表示させない場合も、上記のように、<code>QwtPlot</code>クラスを継承した派生クラスを作成する必要がある。<br> | 指数型の文字列を表示させない場合も、上記のように、<code>QwtPlot</code>クラスを継承した派生クラスを作成する必要がある。<br> | ||
<br><br> | |||
== マーカーを入れる == | |||
マーカーは、縦線・横線およびシンボルを描画することができる。<br> | |||
また、マーカーにテキストのラベルを付加することもできる。<br> | |||
<br> | |||
例えば、Qwt付属のサンプルでは、ピーク値の表示に使用している。<br> | |||
<br> | |||
以下の例では、3種類のマーカーを作成して、全てのマーカーでテキストを右寄せ上寄せに設定している。<br> | |||
マーカーの外観は、他にも様々な設定ができる。<br> | |||
<syntaxhighlight lang="c++"> | |||
// QwtPlotクラスのポインタ(*m_pPlot)とQwtPlotMarkerクラスのポインタ(*m_pPMarker)をメンバに持つ | |||
// QMainWindowクラスのコンストラクタ | |||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) | |||
{ | |||
// ポイントマーカー | |||
m_pPMarker = std::make_unique<QwtPlotMarker>(); | |||
m_pPMarker->setXValue(600.0); | |||
m_pPMarker->setYValue(600.0); | |||
m_pPMarker->setLabelAlignment(Qt::AlignRight | Qt::AlignTop); | |||
QwtText textPMarker("Point marker"); | |||
m_pPMarker->setLabel(textPMarker); | |||
// ポイントシンボル | |||
std::unique_ptr<QwtSymbol> pSymbol = std::make_unique<QwtSymbol>(QwtSymbol::Ellipse, QBrush(QColor::fromRgb(0, 0, 0)), | |||
QPen(QColor::fromRgb(0, 0, 0)), QSize(20, 10)); | |||
m_pPMarker->setSymbol(pSymbol); | |||
m_pPMarker->attach(m_pPlot); | |||
// 横ラインマーカー | |||
m_pHMarker = std::make_unique<QwtPlotMarker>(); | |||
m_pHMarker->setXValue(200.0); | |||
m_pHMarker->setLabelAlignment(Qt::AlignRight | Qt::AlignTop); | |||
m_pHMarker->setLineStyle(QwtPlotMarker::VLine); | |||
m_pHMarker->setLinePen(QPen(Qt::magenta, 0, Qt::DashDotDotLine)); | |||
QwtText textHMarker("Virtical line marker"); | |||
m_pHMarker->setLabel(textHMarker); | |||
m_pHMarker->attach(m_pPlot); | |||
// 縦ラインマーカー | |||
m_pVMarker = std:make_unique<QwtPlotMarker>(); | |||
m_pVMarker->setYValue(100.0); | |||
m_pVMarker->setLabelAlignment(Qt::AlignRight | Qt::AlignTop); | |||
m_pVMarker->setLineStyle(QwtPlotMarker::HLine); | |||
m_pVMarker->setLinePen(QPen(Qt::cyan, 0, Qt::DashDotDotLine)); | |||
QwtText textVMarker("Horizontal line marker"); | |||
m_pVMarker->setLabel(textVMarker); | |||
m_pVMarker->attach(m_pPlot); | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== プロット画面をエクスポートおよび印刷する == | |||
<code>QwtPlotRenderer</code>クラスを使用して、プロット画面をマーカーや軸と共に、エクスポートおよび印刷する。<br> | |||
<br> | |||
以下の例では、SVGにエクスポートおよび印刷している。<br> | |||
<syntaxhighlight lang="c++"> | |||
// 印刷 | |||
void ParentWnd::onPrint() | |||
{ | |||
// m_printerはQPrinterクラスのオブジェクト | |||
QPrintDialog dlgPrint( &m_printer, this ); | |||
if(dlgPrint.exec()) | |||
{ | |||
QwtPlotRenderer renderer; | |||
// m_pPlotはQwtPlotオブジェクトのポインタ | |||
renderer.renderTo(m_pPlot, m_printer); | |||
} | |||
} | |||
// SVGへエクスポート | |||
void ParentWnd::exportSVG( QString strFName ) | |||
{ | |||
QwtPlotRenderer renderer; | |||
// 第3引数はフォーマットの指定, 第4引数はドキュメントサイズをミリ単位で指定, 第5引数は解像度(dpi) | |||
renderer.renderDocument(m_pPlot, strFName, tr("svg"), QSizeF(210, 210), 300); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
ただし、プロットの縦横比を固定しても、印刷時の縦横比は紙サイズに合わせて変化するため、<br> | |||
印刷時において、縦横比を固定する場合は、<code>QwtPlotRenderer</code>クラスの<code>render</code>メソッドを使用して印刷時の範囲を指定する。<br> | |||
(<code>QwtPlotRenderer</code>クラスの<code>renderTo</code>メソッドは使用しない)<br> | |||
<syntaxhighlight lang="c++"> | |||
QRectF rcPrint; | |||
QPainter printPainter(&m_printer); | |||
rcPrint.setWidth(100); | |||
rcPrint.setHeight(100); | |||
renderer.render(m_pPlot, &printPainter, rcPrint); | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||