簡體   English   中英

相對於另一個放置頂層對象

[英]Positioning a top-level object relative to another

我需要放置一個頂層對象,以便它始終相對於另一個頂層對象保持位置。 例如,下圖中的矩形應粘貼到橢圓的“前面”:

正確的定位示例

旋轉180度時,它應如下所示:

正確的定位示例旋轉了180度

而是,矩形的位置不正確:

定位不正確

請運行以下示例( QGraphicsScene的使用僅出於演示目的,因為實際用例在物理學中)。

#include <QtWidgets>

class Scene : public QGraphicsScene
{
    Q_OBJECT
public:
    Scene()
    {
        mEllipse = addEllipse(0, 0, 25, 25);
        mEllipse->setTransformOriginPoint(QPointF(12.5, 12.5));

        QGraphicsLineItem *line = new QGraphicsLineItem(QLineF(0, 0, 0, -12.5), mEllipse);
        line->setPos(12.5, 12.5);

        mRect = addRect(0, 0, 10, 10);
        mRect->setTransformOriginPoint(QPointF(5, 5));

        line = new QGraphicsLineItem(QLineF(0, 0, 0, -5), mRect);
        line->setPos(5, 5);

        connect(&mTimer, SIGNAL(timeout()), this, SLOT(timeout()));
        mTimer.start(5);
    }

public slots:
    void timeout()
    {
        mEllipse->setRotation(mEllipse->rotation() + 0.5);

        QTransform t;
        t.rotate(mEllipse->rotation());

        qreal relativeX = mEllipse->boundingRect().width() / 2 - mRect->boundingRect().width() / 2;
        qreal relativeY = -mRect->boundingRect().height();

        mRect->setPos(mEllipse->pos() + t.map(QPointF(relativeX, relativeY)));
        mRect->setRotation(mEllipse->rotation());
    }

public:
    QTimer mTimer;
    QGraphicsEllipseItem *mEllipse;
    QGraphicsRectItem *mRect;
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QGraphicsView view;
    view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    view.setScene(new Scene);
    view.resize(200, 200);
    view.show();

    return app.exec();
}

#include "main.moc"

請注意,矩形的位置並不總是相同的,但相對於橢圓,它應始終保持相同的位置。 例如,它可能從以下位置開始:

替代定位示例

但是旋轉時它應該保持在相對位置:

替代定位示例旋轉180度

如果要使兩個對象保持相同的相對位置,則它們需要圍繞相同的原點旋轉。

在這里,圓繞其中心(點12.5、12.5)旋轉,但是矩形繞另一個原點(5,5)而不是圓的中心(12.5、12.5)旋轉。

如果您固定了原點,它將按預期工作:

mRect->setTransformOriginPoint(QPointF(12.5, 12.5));

即使矩形以偏移量開始:

mRect = addRect(-10, 0, 10, 10); // Start 10 units to the left

結果截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM