Qt围绕其中心点旋转文本

时间:2016-10-28 07:41:26

标签: c++ qt

我正在使用Qt 5.6,我想在圆圈周围绘制一些文字标签并旋转文字标签以根据圆圈周围的位置定位文字,这样12点的时钟就会有0度旋转,3 o'时钟将旋转90度,6 o'时钟将旋转180度等。

我正在围绕其中心位置对齐文本:

    void drawText(QPainter* pobjPainter, qreal fltX, qreal fltY
                  ,int intFlags, const QString* pobjText) {
        const qreal fltSize = 32767.0;

        QPointF ptfCorner(fltX, fltY - fltSize);

        if ( (intFlags & Qt::AlignHCenter) == Qt::AlignHCenter ) {
            ptfCorner.rx() -= fltSize / 2.0;
        } else if ( (intFlags & Qt::AlignRight) == Qt::AlignRight ) {
            ptfCorner.rx() -= fltSize;
        }
        if ( (intFlags & Qt::AlignVCenter) == Qt::AlignVCenter ) {
            ptfCorner.ry() += fltSize / 2.0;
        } else if ( (intFlags & Qt::AlignTop) == Qt::AlignTop ) {
            ptfCorner.ry() += fltSize;
        }
        QRectF rctPos(ptfCorner, QSizeF(fltSize, fltSize));
        pobjPainter->drawText(rctPos, intFlags, *pobjText);
    }

我想对文字应用轮播。

我想重现与所示内容类似的内容:

http://www.informit.com/articles/article.aspx?p=1405545&seqNum=2

似乎旋转功能会旋转整个画家画布,因此坐标必须考虑旋转,这实际上让我很难过。我想将文本放在椭圆周围,然后旋转它,我怎么知道坐标应该是什么?

1 个答案:

答案 0 :(得分:2)

坚持使用时钟示例,您可以尝试类似......

virtual void paintEvent (QPaintEvent *event) override
  {
    QPainter painter(this);
    double radius = std::min(width(), height()) / 3;
    for (int i = 0; i < 12; ++i) {
      int numeral = i + 1;
      double radians = numeral * 2.0 * 3.141592654 / 12;

      /*
       * Calculate the position of the text centre as it would be required
       * in the absence of a transform.
       */
      QPoint pos = rect().center() + QPoint(radius * std::sin(radians), -radius * std::cos(radians));

      /*
       * Set up the transform.
       */
      QTransform t;
      t.translate(pos.x(), pos.y());
      t.rotateRadians(radians);
      painter.setTransform(t);

      /*
       * Specify a huge bounding rectangle centred at the origin.  The
       * transform should take care of position and orientation.
       */
      painter.drawText(QRect(-(INT_MAX / 2), -(INT_MAX / 2), INT_MAX, INT_MAX), Qt::AlignCenter, QString("%1").arg(numeral));
    }
  }
相关问题