2017-09-19 4 views
0

ウィジェット内のQRectまたはQPointの座標を取得して、そのオブジェクトがエッジと重なり合ってウィジェット外に描画されるかどうかを調べたいとします。Qt - translate()の後にウィジェット内の矩形の位置を取得する

次のプログラムは、私の問題を示すための単なるテストプログラムです。黒い四角形が描かれたウィンドウがあります。 QPainterのtranslate()を使って座標系を移動します。その後、私は矩形の正しい座標を得ることができません。

私はすべての座標系の操作(translate()、rotate()、scale())を追跡することができましたが、良い解決策ではありません。ウィジェットの左上隅を基準に矩形の位置を取得する簡単な方法はありますか?私が取得したいwoul何

#include "widget.h" 
#include <QPainter> 
#include <iostream> 

Widget::Widget(QWidget *parent)  
    : QWidget(parent) 
{ 

} 

void Widget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this);  
    painter.translate(width()/2, height()/2); 

    QRect rectangle(100, 50, 200, 100); 

    std::cout << "width(): " << this->width() << "\theight(): " << this->height() 
       << "\trecLeft X: " << rectangle.x() << "\trecTop Y: " << rectangle.y() 
       << std::endl; 
    //Output: width(): 960 height(): 432 recLeft X: 100 recTop Y: 50 
} 

は次のとおりです。

recLeft X: 580(width()/2+100) recTop Y: 266(height()/2+50)

+0

これは、矩形の座標にも影響しますか? – vahancho

答えて

0

あなたは画家の変換行列を取得し、あなたの四角形に適用することができます。

QTransform trans= painter.combinedTransform(); 
QRect transformed = trans.mapRect(rectangle); 
+0

'QRectangle'は実際に' QPolygon'にマップされます。この場合、 'boundingRect'を使うことができます。 –

+0

@MatteoItaliaあなたが正しいです、例を修正しました –

+0

'QPolygon'コンストラクタを削除することができます。' QRectangle'をとり 'QPolygon'を返す' map'オーバーロードがあります。 –

関連する問題