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的。