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