Qt Graphics View Framework中左手系轉右手系

問題來源

我們從小學習的數學中是右手座標系,很多系統中(如:ros)也是右手系,而Qt Graphics View Framework 中卻是左手座標系,當兩個不同座標系的系統結合時,導致了界面上顯示的內容和其他系統中的內容是上下翻轉的,雖然看起來彆扭,但是各種操作卻不會有任何問題。

解決辦法

方案一

在QGrahpicsView中將整個顯示上下翻轉,也就是座標系還是原來的座標系,但是顯示上是上下翻轉的,這樣就很迅速的解決了問題。

GraphicsView::GraphicsView(QWidget *parent) : QGraphicsView(parent)
{
    ...
    
    // NOTE:解決左手座標系和右手座標系的問題,Qt是左手座標系,算法是右手座標系,所以此處要將座標系的Y軸翻轉
    QTransform transform;   
    transform.setMatrix(1, 0, 0,
                        0, -1, 0,
                        0, 0, 1);
    setTransform(transform);
}

當然這種解決方案也帶來些小問題:
比如說:要將QRect的四個點的座標按照順時針方向發給算法模塊在座標系沒有變換前,四個點發送的順序是:rect.topLeft() => rect.topRight() => rect.bottomRight() => rect.bottomLeft()。但在座標系變換後,四個點發送順序成了:rect.bottomLeft() => rect.bottomRight() => rect.topRight() => rect.topLeft()。
當然,你畫的字體也是顛倒的,需要手動將其翻轉。

void GraphicsRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QGraphicsRectItem::paint(painter, option, widget);

    // 將文本翻轉
    QTransform transform;
    transform.setMatrix(1, 0, 0,
                        0, -1, 0,
                        0, rect().center().y() * 2, 1);
    painter->setTransform(transform, true);
    painter->drawText(rect(), Qt::AlignCenter,  QObject::tr("靜態區域"));

}

方案二

在Qt和算法接口模塊中實現兩個函數,QPointF mapToScene(const QPointF &point)和QPointF mapFromScene(const QPointF &point),凡是進入Qt的座標都調用一次mapToScene(),凡是從Qt出去的座標調用一次mapFromScene(),這樣能完美解決問題,但是會有些複雜。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章