Qt 坐标系统
一.坐标系统
以屏幕的左上角为原点即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,这整个屏幕的坐标系统就用来定位顶层窗口;
此外,窗口内部也有自己的坐标系统,它依然以左上角作为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫做Client Area(客户区),在客户区的周围则是标题栏(Windows Title)和边框(Frame)。
二.坐标分析
创建了一个最顶层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();
}
输出结果:
结论:
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的注释:
move函数移动的位置其实是它的外框移动的位置。
调用w.setGeometry(0,0,400,300)方法,可以使客户区x、y坐标与屏幕左上角重合,需要隐藏窗口标题栏。调用以下方法设置窗口隐藏。
w.setWindowFlags(Qt::FramelessWindowHint)
三.坐标转换
在窗口上放了一个pushButton,如图
如果想要知道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);