各种获取控件坐标的方法总结

最近遇到非常多需要获取控件在屏幕中位置的需求,用途有很多,比如一些抛物线动画的起始点、popupwindow的显示位置、scrollview中用于滑动跳转到固定位置等,这里总结一下:

1.获取屏幕的大小

 WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        int width = manager.getDefaultDisplay().getWidth();
        int heigh = manager.getDefaultDisplay().getHeight();

//第二种
WindowManager manager1 = this.getWindowManager();
        int width1 = manager1.getDefaultDisplay().getWidth();
        int heigh1 = manager1.getDefaultDisplay().getHeight();

//第三种
WindowManager manager2 = this.getWindowManager();
        DisplayMetrics outMetrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(outMetrics);
        int width3 = outMetrics.widthPixels;
        int height3 = outMetrics.heightPixels;
//第四种

Resources resources = this.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        float density = dm.density;
        int width4 = dm.widthPixels;
        int height4 = dm.heightPixels;

日志输出:
这里写图片描述
其中方法一和二过时了,建议使用后两个,density 为屏幕密度。

2.获取控件的位置

int[] location = new int[2];
                v.getLocationOnScreen(location);
                int x = location[0];
                int y = location[1];

//第二种
int[] location1 = new int[2];
                v.getLocationInWindow(location1);
                int x1 = location[0];
                int y1 = location[1];

getLocationOnScreen获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。getLocationInWindow获取在当前窗口内的绝对坐标.
getLocationInWindow()和 getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大
这里需要注意的是:如果在oncreate中去获取控价的位置得到的都是0,原因是因为此时控件还没有加载完。

这里有个全面点的文章可以参考

3.获取控件的宽高
控件宽高有view.getWidth()和view.getHeight(),但是这两个方法在onCreate()方法里同样得到的都是0,先找到几种方式:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        Log.i("apple",begin.getWidth()+"~~onWindowFocusChanged~~"+begin.getHeight());
    }
   begin.post(new Runnable() {
            @Override
            public void run() {
                int[] location = new int[2];
                begin.getLocationOnScreen(location);
                int x = location[0];
                int y = location[1];
                Log.i("apple","by onCreate x~~~"+x+"~~~y~~~"+y);
                Log.i("apple",begin.getWidth()+"~~post~~"+begin.getHeight());
            }
        });
 int w = View.MeasureSpec.makeMeasureSpec(0,
                View.MeasureSpec.UNSPECIFIED);
        int h = View.MeasureSpec.makeMeasureSpec(0,
                View.MeasureSpec.UNSPECIFIED);
        begin.measure(w, h);
        int btwidth = begin.getMeasuredWidth();
        int btheight = begin.getMeasuredHeight();
        Log.i("apple","btwidth~~~"+btwidth+"~~~btheight~~~"+btheight);

第一种重写onWindowFocusChanged方法,第二三种都是可以在oncreate里获取到宽高的。
这里写图片描述

<think>好的,用户想了解如何在Qt中获取控件坐标。我需要分步骤解释清楚,确保涵盖不同情况,并且结构清晰。 首先,要明确Qt中的坐标系。Qt使用的是相对于父控件坐标系统,原点在左上角,x向右,y向下。这点很重要,因为控件位置是相对于父容器的。 接下来,用户可能需要获取控件位置。常用的方法有pos(),返回的是相对于父控件的QPoint。比如,一个按钮在父窗口中的位置,可以用button->pos()得到。 然后,用户可能想知道控件相对于窗口或屏幕位置。这时候需要区分窗口坐标屏幕坐标。使用mapToGlobal可以将控件位置转换为全局屏幕坐标。例如,button->mapToGlobal(QPoint(0,0))会得到该控件左上角在屏幕上的坐标。 另外,控件可能有多个父级,或者需要相对于其他控件坐标。这时可以用mapTo或mapFrom方法进行坐标转换。例如,将控件A的位置转换到控件B的坐标系中,可以用A->mapTo(B, A->pos())。 还有,如果用户想获取控件的几何信息,包括位置和大小,可以用geometry()方法,返回QRect。而frameGeometry()则包括窗口的边框。 需要注意的是,如果控件还没显示出来,获取坐标可能不正确。这时候应该等到控件显示后再获取,或者在resizeEvent等事件处理函数中调用。 最后,应该提醒用户注意父控件的影响,如果父控件移动,子控件位置也会变化。因此,坐标是动态的,可能需要实时更新。 总结步骤:先介绍坐标系,再讲获取相对父控件位置,然后转换到窗口或屏幕坐标,接着是与其他控件的转换,最后提及几何信息和注意事项。这样用户就能全面了解如何获取不同情况下的坐标了。</think>在Qt中获取控件坐标主要涉及以下几个关键点和步骤: 1. **理解坐标系系统** - Qt使用**相对坐标系**,控件位置是相对于其父容件的 - 原点(0,0)位于父容器的左上角 - X轴向右延伸,Y轴向下延伸 2. **获取相对父容器的坐标** ```cpp QPoint relativePos = widget->pos(); // 返回QPoint对象 int x = relativePos.x(); int y = relativePos.y(); ``` - `pos()`方法返回控件相对于父容器的坐标 - 适用于大多数常规布局需求 3. **获取绝对屏幕坐标** ```cpp QPoint screenPos = widget->mapToGlobal(QPoint(0, 0)); ``` - `mapToGlobal()`将控件原点(0,0)转换为屏幕坐标 - 适用于需要系统级定位的场景(如弹出菜单) 4. **获取窗口内坐标** ```cpp QPoint windowPos = widget->mapTo(parentWindow, QPoint(0, 0)); ``` - 当需要相对于特定窗口定位时使用 - 可指定任意参考容器进行坐标转换 5. **几何信息获取** ```cpp QRect geometry = widget->geometry(); // 获取包含边框的几何信息 QRect frameGeo = widget->frameGeometry(); // 包含窗口装饰的几何信息 ``` 6. **注意事项** - 在控件显示前(`show()`调用前)获取坐标可能无效 - 布局管理器可能会修改控件位置,建议在`resizeEvent`或`showEvent`中获取 - 使用`QWidget::move()`方法可以动态设置控件位置 **完整示例代码**: ```cpp // 获取相对于父容器的坐标 QPoint relativePos = ui->pushButton->pos(); qDebug() << "Relative position:" << relativePos; // 获取屏幕绝对坐标 QPoint globalPos = ui->pushButton->mapToGlobal(QPoint(0,0)); qDebug() << "Screen position:" << globalPos; // 获取控件尺寸 QRect geometry = ui->pushButton->geometry(); qDebug() << "Width:" << geometry.width() << "Height:" << geometry.height(); ``` 通过理解这些坐标系统的差异,结合具体的应用场景选择合适的方法,可以准确获取和操作控件位置信息。对于动态布局的界面,建议结合Qt的信号槽机制实时更新坐标信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值