Qt的設置兩個窗口位置重合

QWidget中有很多獲取座標以及座標轉換的函數。總體來說主要是1、相對於屏幕的全局座標  2,、相對於窗口的相對座標

下面這張圖中由於只有一個窗口所有所有的座標都是全局座標

但是當此窗口中再加入一個子窗口,就複雜很多。

對於子窗口來說,所有獲取座標的函數都變成相對座標了。

座標轉換:mapFromGlobal,mapToGlobal,mapToParent

移動窗口:move

move的用法Qt中解釋容易混淆,If the widget is a window, the position is that of the widget on the desktop, including its frame.

意思就是:如果該widget沒有父窗口就是全局座標,有父窗口就是相對父窗口的座標。相當於沒父窗口那麼屏幕就是父窗口。

(其實也不是絕對的,比如子窗口設置爲Qt::Tool後窗口座標就不再跟隨父窗口而是全局)

實現功能:將紅色窗口的左上角與灰色窗口左上角重合

窗口的層級如下(widget是灰色窗口):

設置紅色窗口左上角座標,即move函數的參數QPoint。

1、首先,這裏的QPoint是相對NullWidget的,也就是說move(QPoint(0,0)),是移動紅色窗口到主窗口的左上角而不是屏幕左上角。

2、接下來就是獲取灰色窗口相對於NullWidget的座標,這裏如果直接用QPoint(ui.widget->geometry().x(),ui.widget->geometry().y())是錯誤的(效果如下圖)。

3、故而這邊得分爲兩步,首先獲取灰色窗口左上角相對於屏幕的絕對位置。QPoint glPoint = ui.widget->mapToGlobal(QPoint(0,0));

然後獲取glPoint相對於NullWidget的位置,QPoint nullPoint = this->mapFromGlobal(glPoint);

最後w->move(nullPoint);就好了

代碼:

NullWidget::NullWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    w = new QWidget(this);//紅色窗口
    w->setStyleSheet(QString(" background-color: rgb(255, 0, 0)"));
}


void NullWidget::moveEvent(QMoveEvent* event)
{
    QPoint bb = ui.widget->mapToGlobal(QPoint(0,0));
    QPoint cc = mapFromGlobal(bb);
    w->move(cc);
}

 

最後有個問題,如果想要紅色窗口與ui.gridLayout左上角重合怎麼做呢?QLayout是沒有mapToGlobal的。

 

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