赞
踩
目录
Qt 设置:两个窗口位置重合
QT向界面中嵌套新的界面
===================
https://www.cnblogs.com/bob-jianfeng/p/11609012.html
先进入ui编辑界面,加入一个水平或者垂直的布局(根据自己选则,我用水平)充满整个mainwindow
注意右边我更改了 QHBoxLayout的名称 为pHBoxLayout
然后运行一遍 ;(注意需要运行一遍 要不然类找不到pHBoxLayout 这个布局)
接着定义一个方法(向mainwindow增加窗口的方法) (mainwindow.cpp)
1 void MainWindow::putwidget(QWidget* widget) 2 { 3 ui->pHBoxLayout->addWidget(widget); 4 }
新建一个class文件 定义为myWidget名称 inherent QObject和QWidget
在类名myWidget后面增加 :public QWidget
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的。
————————————————
版权声明:本文为CSDN博主「hhlhhll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_28572705/article/details/103051951
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。