Поверните прямоугольник вокруг его центра - PullRequest
6 голосов
/ 21 декабря 2011

Мне нужно повернуть прямоугольник вокруг его центральной точки и отобразить его в центре QWidget. Можете ли вы завершить этот конкретный код? Если возможно, не могли бы вы также объяснить объяснение или дать ссылку на простейшее объяснение?

Обратите внимание: я прочитал документацию по Qt, скомпилировал примеры / демонстрации, которые имеют дело с ротацией, и я ВСЕ ЕЩЕ не могу это понять!

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));

}

1 Ответ

10 голосов
/ 21 декабря 2011
 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));
  }

Вы находитесь в системе координат художника.Когда вы вызываете drawRect (x, y, 13, 17), его левый верхний угол находится на (x,y).Если вы хотите, чтобы (x, y) был центром вашего прямоугольника, вам нужно переместить прямоугольник наполовину, следовательно, rx и ry.

Вы можете вызвать resetTransform(), чтобы сбросить преобразования, которыебыли сделаны translate() и rotate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...