2011-12-21 32 views
5

Bir noktayı merkez noktasının etrafında döndürmem ve bir QWidget'ın ortasında göstermem gerekiyor. Bu özel kodu tamamlayabilir misiniz? Mümkünse, açıklamayı da aşağılamak ya da en basit açıklamaya bir link verebilir misiniz?Dikdörtgeni merkezin etrafında döndürün

Lütfen dikkat: Qt belgelerini okudum, döndürme ile ilgili derlenmiş örnekler/demolar ve STILL bunu anlayamıyorum!

void Canvas::paintEvent(QPaintEvent *event) 
{ 
    QPainter paint(this); 

    paint.setBrush(Qt::transparent); 
    paint.setPen(Qt::black); 
    paint.drawLine(this->width()/2, 0, this->width()/2, this->height()); 
    paint.drawLine(0, this->height()/2, this->width(), this->height()/2); 

    paint.setBrush(Qt::white); 
    paint.setPen(Qt::blue); 

    // Draw a 13x17 rectangle rotated to 45 degrees around its center-point 
    // in the center of the canvas. 

    paint.drawRect(QRect(0,0, 13, 17)); 

} 

cevap

9
void paintEvent(QPaintEvent* event){ 
    QPainter painter(this); 

    // xc and yc are the center of the widget's rect. 
    qreal xc = width() * 0.5; 
    qreal yc = height() * 0.5; 

    painter.setPen(Qt::black); 

    // draw the cross lines. 
    painter.drawLine(xc, rect().top(), xc, rect().bottom()); 
    painter.drawLine(rect().left(), yc, rect().right(), yc); 

    painter.setBrush(Qt::white); 
    painter.setPen(Qt::blue); 

    // Draw a 13x17 rectangle rotated to 45 degrees around its center-point 
    // in the center of the canvas. 

    // translates the coordinate system by xc and yc 
    painter.translate(xc, yc); 

    // then rotate the coordinate system by 45 degrees 
    painter.rotate(45); 

    // we need to move the rectangle that we draw by rx and ry so it's in the center. 
    qreal rx = -(13 * 0.5); 
    qreal ry = -(17 * 0.5); 
    painter.drawRect(QRect(rx, ry, 13, 17)); 
    } 

Sen ressamın koordinat sisteminde bulunmaktadır. DrawRect (x, y, 13, 17) çağırdığınızda, sol üst köşede (x,y) bulunur. Dikdörtgenin ortası olacak şekilde (x, y)'u istiyorsanız, dikdörtgeni yarıya, dolayısıyla rx ve ry'a taşımanız gerekir.

translate() ve rotate() tarafından yapılan dönüştürmeleri sıfırlamak için resetTransform() numaralı telefonu arayabilirsiniz.

+3

Ben * düşünüyorum * Şu an neler olduğunu anlıyorum. Ressam DAİMA, ne olursa olsun 0,0'dan başlar. Yani 100,100 Painter'a çevirdiğinizde hala 0,0'dan başlıyor, fakat yeni 0,0 şimdi 100.100 olacak mı? –

İlgili konular