精华内容
下载资源
问答
  • Qt坐标系统

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

    Qt 也提供了几种组件定位的技术。其中就包括绝对定位和相对定位,好理解,如图

    主窗口的定位

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

    客户区(子窗口)定位:

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

    如此嵌套!

    坐标系统这块技术在后期2D画图的研究中会继续深究!

     

    展开全文
  • QT坐标系统

    2020-05-19 18:11:17
    Qt中,坐标系可以细分成三类: 相对于屏幕的全局坐标 相对于顶层窗口的窗口坐标 相对于控件的控件坐标 Qt中的三类坐标一般是先获得全局坐标,然后将其转换为另外两类坐标。 如果是顶层窗口为转换对象,则转换成...

    Qt中,坐标系可以细分成三类:

    • 相对于屏幕的全局坐标
    • 相对于顶层窗口的窗口坐标
    • 相对于控件的控件坐标

    Qt中的三类坐标一般是先获得全局坐标,然后将其转换为另外两类坐标。
    如果是顶层窗口为转换对象,则转换成窗口坐标;如果是控件为转换对象,则转换成控件坐标。

    具体实现
    在这里插入图片描述
    然后整个坐标的获取是在鼠标移动事件里面实现的:
    在这里插入图片描述
    接下来是实现代码:

    void MainWindow::mouseMoveEvent(QMouseEvent *event)
    {
        //获得相对于屏幕的坐标
        QPoint sPoint1=event->globalPos();
        qDebug()<<"相对于屏幕坐标1:"<<"("<<sPoint1.rx()<<","<<sPoint1.ry()<<")";
        //获得相对于屏幕的坐标
        QPoint sPoint2=QCursor::pos();
        qDebug()<<"相对于屏幕坐标2:"<<"("<<sPoint2.rx()<<","<<sPoint2.ry()<<")";
        //获得相对于窗口的坐标
        QPoint windowPoint=this->mapFromGlobal(sPoint2);
        qDebug()<<"相对于窗口坐标:"<<"("<<windowPoint.rx()<<","<<windowPoint.ry()<<")";
        //获得相对于控件的坐标
        QPoint widgetPoint=ui->label->mapFromGlobal(sPoint1);
        qDebug()<<"相对于控件坐标:"<<"("<<widgetPoint.rx()<<","<<widgetPoint.ry()<<")";
    }
    

    运行程序,在绿色区域的左上角移动:

    在这里插入图片描述
    获得各类坐标:
    在这里插入图片描述

    展开全文
  • Qt 坐标系统

    2020-01-02 19:36:25
    坐标系统 以屏幕的左上角为原点即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,这整个屏幕的坐标系统就用来定位顶层窗口; 此外,窗口内部也有自己的坐标系统,它依然以左上角作为原点,从左向右为x轴正向,...

    一.坐标系统

    以屏幕的左上角为原点即(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);

    四.坐标变换

    坐标变换、包括平移、旋转、缩放。

    展开全文
  • QT 坐标系统

    2016-07-29 10:44:51
    一个绘图设备的默认坐标系统中原点(0,0)在其左上角,x坐标向右增长,y坐标向下增长。 逻辑坐标与绘图设备的物理坐标之间的映射由QPainter的变换矩阵、视口和窗口来处理的。逻辑坐标和物理坐标默认是一致的。 ...

    转自:http://blog.csdn.net/lwbeyond/article/details/41515887


    一个绘图设备的默认坐标系统中原点(0,0)在其左上角,x坐标向右增长,y坐标向下增长。
    逻辑坐标与绘图设备的物理坐标之间的映射由QPainter的变换矩阵、视口和窗口来处理的。逻辑坐标和物理坐标默认是一致的。

    一. 抗锯齿渲染

    默认情况下,绘制会产生锯齿。
    可以使用抗锯齿渲染提示,
    1. QPainter::setRenderHint(QPainter::Antialiasing); //告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制  
    2. QPainter::setRenderHint<QPainter::SmoothPixmapTransform); //使用平滑的pixmap变换算法(双线性插值算法),而不是近邻插值算法  
    3. QPainter::setRenderHint<QPainter::TextAntialiasing); //尽可能的情况下文字的反锯齿绘制  

    二. 基本变换

    QPainter::scale();//缩放坐标系统QPainter::rotate();//顺时针旋转坐标系统QPainter::translate();//平移坐标系统QPainter::shear();//围绕原点来扭曲坐标系统QPainter::save();//用来保存QPainter的变换矩阵QPainter::restore();//用来恢复
    1. //平移坐标系统,也就是说以(200,150)作为新的原点(0,0)  
    2. QPainter::translate(200, 150); //水平移到200, 垂直移动150  
    3.   
    4. //旋转坐标系统  
    5. //rotate()函数会以原点为中心进行旋转,参数为旋转的角度,正数为顺时针旋转,负数为逆时针旋转  
    6. QPainter::rotate(90);  

    三. 窗口、视口转换

    逻辑坐标到物理坐标的映射主要由以下函数来处理。
    QPainter 的 worldTransform()函数
    QPainter 的 viewport()函数
    QPainter 的 window()函数
    其中视口(viewport)表示物理坐标下指定的一个任意矩形,而窗口(window)表示逻辑坐标下的相同矩形。
    默认情况下逻辑坐标和物理坐标是重合的。

    1. 窗口(逻辑区域)
    窗口代表要逻辑处理的区域,他始终以视口(物理)坐标为最终目标进行映射,他的大小和逻辑位置可以通过QPainter::setWindow()设置,但是无论大小和逻辑位置设置为什么数值,他始终代表着整个视口。

    例如有一个实际大小为 200×200 像素的窗口,那么原始状态之下窗口大小也是 200×200,视口大小也是 200×200。
    现在在(0,0)位置画一个大小为 100×100 的矩形的时候,他会占视口左上角的4分之一。
    painter.drawRect(0,0,100,100);

    如果这时候我们通过 QPainter::setWindow 修改了窗口位置和大小,例如 setWindow(-50,-50,100,100)
    设置完后,窗口代表的还是整个视口(物理),但是映射的数值有所不同:
    此时窗口的逻辑坐标(-50,-50)对应视口(物理)坐标的(0,0)。
    而窗口的逻辑大小成为了100×100的单位长度,也就是用100个单位长度代表原本物理大小的200像素,所以每一个单位长度就是实际的2像素。

    因为QPainter是以窗口(逻辑)坐标为基础的,所以这时候画一个位置为(-50,-50),大小为 50,50的矩形。

    painter.drawRect(-50,-50,50,50);还是和以前画的是一样的的效果。

    也就是说,我们将窗口(逻辑)宽 100px 映射成视口(物理)宽 200px,窗口高 100px 映射成物理高 200px,逻辑-50,-50映射成物理的0,0


    2. 视口(物理区域)
    现在来改变视口的属性,先用painter.setViewPort(0,0,100,100);
    上面语句的作用就是把把视口的坐标设置为绘图区的左上角(0,0)位置,大小设置为绘图区的一半,因为绘图区是(200×200),而我们把视口设置为(100×100)。

    即现在实际的绘图区为绘图设备的左上角的4分之一。

    也就是说,我们将视口(物理)宽 100px 映射成窗口(逻辑)宽 200px,视口高 100px 映射成窗口高 200px


    这时候我们再用
    painter.drawRect(0,0,100,100);画一个矩形,实际显示是怎么样的呢?看下图:


    绘制出来的是dialog的16分之一了,为什么会这样呢?

    前面我们讲过窗口坐标始终以视口(逻辑)坐标为最终目标进行映射,而原来没有经过修改的窗口的属性为以左上角为原点,大小为200×200单位长度,我们修改视口大小为100×100像素后,窗口的200单位长度就映射到100像素的视口长度上,即每一单位长度为0.5像素,所以绘制出来的结果就是100×0.5=50像素,所以长和高都是dialog的4分之一,面积就是16分之一了。

    3. 让视口和窗口维持相同的宽高比来防止变形
    1. int side = qMin(width(), height()); //取长度和宽度的最小值  
    2. int x = (width() - side/2);  
    3. int y = (height() - side/2);  
    4. painter.setViewport(x,y,side,side); //物理的(x,y)映射成逻辑的(0,0);物理的宽side,映射成逻辑的width()...... 

    展开全文
  • qt坐标系统

    2013-07-29 16:06:41
    一下是网站链接,http://hi.baidu.com/12314fafd感谢作者,通过作者的一些分析,我的一些问题终于解决了。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 539
精华内容 215
关键字:

qt坐标系统