12,925
回編集
(ページの作成:「== 概要 == Qtでは画像を取り扱うクラスとしてQBitmap、QPixmap、QImageの3種類あり、それぞれ使い分けが必要である。<br> <br> ここで…」) |
|||
91行目: | 91行目: | ||
<br><br> | <br><br> | ||
== | == ズームイン・ズームアウト・移動 == | ||
画像を表示する機能には、ズームイン・ズームアウト、移動等の制御が必要になる場合が多い。<br> | 画像を表示する機能には、ズームイン・ズームアウト、移動等の制御が必要になる場合が多い。<br> | ||
これらの機能を実装するには、QTransformクラスを使用する。<br> | これらの機能を実装するには、QTransformクラスを使用する。<br> | ||
228行目: | 228行目: | ||
QWidget::mousePressEvent(event); | QWidget::mousePressEvent(event); | ||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 画像のクリック位置の座標を逆算する == | |||
画像上において、クリックする位置の座標を取得して、ピクセル値を取得する操作がある。<br> | |||
<br> | |||
画像がウインドウの一辺に合わせて全体が表示されている場合は縦横比のみを考慮すればよいが、<br> | |||
ズームイン・ズームアウト・移動している場合、座標を取得することは困難である。<br> | |||
<br> | |||
Qtでは、ズームイン・ズームアウト・移動の情報は変換行列が持っているため、それを元に逆算することで簡単に座標を取得できる。<br> | |||
<br> | |||
以下の例では、画像をクリックする時に座標を渡してシグナルを発行している。<br> | |||
その後、ウィジェットの親ウィンドウ側でシグナルを受信して、該当ピクセルに対する処理を実行する。<br> | |||
<syntaxhighlight lang="c++"> | |||
class MyGraphicsView : public QGraphicsView | |||
{ | |||
Q_OBJECT | |||
protected: | |||
void mousePressEvent(QMouseEvent *event) | |||
// 画像の座標を送信するシグナルを定義する | |||
signals: | |||
void mousePressed(QPoint p); | |||
// ...略 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
void MyGraphicsView::mousePressEvent(QMouseEvent *event) | |||
{ | |||
// ウィンドウサイズと画像サイズの比を計算する | |||
double dScale = (double)viewport()->width() / (double)m_pimg->width; | |||
if(dScale > ((double)viewport()->height() / (double)m_pimg->height)) | |||
{ | |||
dScale = (double)viewport()->height() / (double)m_pimg->height; | |||
} | |||
// 画像座標を計算してシグナルを発行 | |||
QPointF p = m_matrix_inv.map(event->pos()); | |||
emit mousePressed(QPoint(p.x() / dScale, p.y() / dScale)); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |