zoukankan      html  css  js  c++  java
  • Qt中QRect和CRect的比较

    本文介绍QtQRectWindows下的CRect的比较。

    构造方法

    QRect的无参构造方法是这样的:

    QRect(): x1(0),y1(0),x2(-1),y2(-1)
    
    

    默认构造的x2和y2为-1,而CRect的无参构造这两个数值为0。

    带4个整形参数未知的构造方法是这样的:

    QRect(int aleft, int atop, int awidth, int aheight)
    {
      x1 = aleft;
      y1 = atop;
      x2 = aleft + awidth - 1;
      y2 = atop + aheight - 1;
    }
    
    

    CRect的四个整形参数构造方法是这样的:

    CRect::CRect(int l, int t, int r, int b)
    {
    	left = l;
    	top = t;
    	right = r;
    	bottom = b;
    }
    
    

    注意第三个参数是宽度,第四个是高度,而CRect的4个整形参数,后两个是rightbottom,内在

    宽高属性

    因为QRect在设置宽度时,x2的坐标有-1操作,要获得构造时的宽度,就通过 x2 - x1 + 1,这样的方法来获得,这也是 QRect::width()的内部实现。

    CRect的宽度width直接等于 right - left。在CRect中,经常是这样设置宽度的,

    
    const int nWidth = 15;
    CRect rt;
    rt.left = 10;
    rt.right = rt.left + nWidth;
    
    

    这样设置目标宽度和设置是要一致的。如果上述做法迁移到QRect上,就会有偏大。

    
    const int nWidth = 15;
    QRect rt;
    rt.setLeft(10);
    rt.setRight(rt.left() + nWidth);
    
    

    这样设置,rt的宽度实际上是16,而不是期望的15.如果需要正确的设置,则需要这样:

    
    const int nWidth = 15;
    QRect rt;
    rt.setLeft(10);
    rt.setWidth(nWidth);
    
    

    调用setWidth来设置宽度,可使得结果与预期一致。QRect的高度设置也是一样,建议用setHeight来设置高度.

    另一点注意,QRect::setWidthQRect::setHeight是通过更改x2y2来改变宽高,左上角坐标是不会改变的。以下的做法是不能达到目的的:

    
    // 先设置右边距,再设置宽度,这样不会使得left边界位于10这里
    QRect rt;
    rt.setRight(20);
    rt.setWidth(10);
    
    

    QRect的其他函数说明

    moveLeft是移动整个矩形,使之位于指定左边距。

    setLeft 是移动左边距,不会改变右边距。

    获得右边距:建议使用 x() + width(),而不是 right()。right()会比实际位置少1个单位。

    获得下边距:建议使用 y() + height(),而不是 bottom()。

    小结

    QRect类建议只使用left(),top(),width()和height()这些成员函数,不要用right()bottom()函数。

    参考文档:

    Qt 学习之路 :坐标系统

    作者:浩天之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    Top
    收藏
    关注
    评论
  • 相关阅读:
    rsyslog 定义模板
    rsyslog ~ 波浪号
    rsyslog ~ 波浪号
    过滤器
    过滤器
    rsyslog masg和rawmsg的区别
    rsyslog masg和rawmsg的区别
    nginx 通过rsyslog发日志 rsyslog服务器挂掉 日志丢失问题
    nginx 通过rsyslog发日志 rsyslog服务器挂掉 日志丢失问题
    NYOJ64
  • 原文地址:https://www.cnblogs.com/cherishui/p/15720788.html
Copyright © 2011-2022 走看看