欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt 坐标系统

程序员文章站 2022-05-22 22:53:16
...

一.坐标系统

以屏幕的左上角为原点即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,这整个屏幕的坐标系统就用来定位顶层窗口

此外,窗口内部也有自己的坐标系统,它依然以左上角作为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫做Client Area(客户区),在客户区的周围则是标题栏(Windows Title)和边框(Frame)。

Qt 坐标系统

二.坐标分析 

创建了一个最顶层Widget。 

#include "widget.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    qDebug()<<"=============窗口属性=============";
    qDebug()<<"w.x() = "<<w.x();
    qDebug()<<"w.y() = "<<w.y();
    qDebug()<<"w.width() = "<<w.width();
    qDebug()<<"w.height() = "<<w.height();
    qDebug()<<"==========Geometry属性============";
    qDebug()<<"w.geometry().x() = "<<w.geometry().x();
    qDebug()<<"w.geometry().y() = "<<w.geometry().y();
    qDebug()<<"w.geometry().width() = "<<w.geometry().width();
    qDebug()<<"w.geometry().height() = "<<w.geometry().height();
    qDebug()<<"==========frameGeometry属性============";
    qDebug()<<"w.frameGeometry().x() = "<<w.frameGeometry().x();
    qDebug()<<"w.frameGeometry().y() = "<<w.frameGeometry().y();
    qDebug()<<"w.frameGeometry().width() = "<<w.frameGeometry().width();
    qDebug()<<"w.frameGeometry().height() = "<<w.frameGeometry().height();

    return a.exec();
}

输出结果:

Qt 坐标系统

结论:

1.QWidget提供的x,y表示的坐标与frameGeometry().x(),frameGeometry().y()的相同。

2.geomerty()函数,表示客户区的函数,其长和宽 和 widget的长和宽相同,但是其x、y坐标比widget的x、y坐标大,这就证实上图中的坐标系统。

3.frameGeometry().width(),frameGeometry().height(),比widget的长和宽要大一些。

分析2:

调用move(0,0)方法。使其移动到屏蔽的左上角。以下是我调用move(0,0)方法后,可以明显看见窗口左上角未与屏幕左上角重合,可以自己去试试。

Qt 坐标系统

结论:

以下是Qt的注释:

Qt 坐标系统

move函数移动的位置其实是它的外框移动的位置。

调用w.setGeometry(0,0,400,300)方法,可以使客户区x、y坐标与屏幕左上角重合,需要隐藏窗口标题栏。调用以下方法设置窗口隐藏。

w.setWindowFlags(Qt::FramelessWindowHint)

三.坐标转换

 在窗口上放了一个pushButton,如图

Qt 坐标系统

如果想要知道pushButton的左上角坐标相对于整个屏幕的坐标,则调用

QPoint pos = ui->pushButton->pos(); 

QPoint posLeftUp = w.mapToGlobal(pos);

如果想要知道pushButton的右下角坐标相对于整个屏幕的坐标,则调用

QPoint pos = ui->pushButton->pos();

QPoint pos2;

pos2.setX(pos.x()+ui->pushButton->width());

pos2.setY(pos.y()+ui->pushButton->height());

QPoint posRightDown= w.mapToGlobal(pos2);

 

大家觉得OK,请点个赞????????????,谢谢。