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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值