Qt5位置相关函数异同详解(附源码)

Qt5中提供了丰富的位置和区域大小相关函数。下面讲一讲他们的区别。

主要函数:

1、x(),y(),pos():获取整个窗体左上角的坐标位置。

2、frameGeometry():获取整个窗体左上角的坐标和长宽值。

3、geometry():获取窗体中央区域左上角的坐标和长宽值。

4、width()和height():获取窗体中央区域的长宽值。

5、size():获取窗体中央区域的长宽值。

6、rect():获得的左上角坐标始终为(0,0),长宽值为中央区域的长宽值。

下面举一个实例,来区分这几个函数的功能。

实例:

1、新建GUI应用,项目名称为“Geometry”,基类选择“QDialog”,类名自定,取消“创建界面”复选框,最后完成项目工程的建立。

2、打开“dialog.h”,添加如下代码:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QGridLayout>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

    void updateLabel();

private:
    QLabel *xLabel;
    QLabel *xValueLabel;

    QLabel *yLabel;
    QLabel *yValueLabel;

    QLabel *frmLabel;
    QLabel *frmValueLabel;

    QLabel *posLabel;
    QLabel *posValueLabel;

    QLabel *geoLabel;
    QLabel *geoValueLabel;

    QLabel *widthLabel;
    QLabel *widthValueLabel;

    QLabel *heightLabel;
    QLabel *heightValueLabel;

    QLabel *rectLabel;
    QLabel *rectValueLabel;

    QLabel *sizeLabel;
    QLabel *sizeValueLabel;

    QGridLayout *mainLayout;

protected:
    void moveEvent(QMoveEvent *);   //鼠标移动事件
    void resizeEvent(QResizeEvent *);   //大小改变
};

#endif // DIALOG_H

3、打开"dialog.cpp",添加如下代码:

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("Geometry"));

    xLabel = new QLabel(tr("X(): "));
    xValueLabel = new QLabel;

    yLabel = new QLabel(tr("Y(): "));
    yValueLabel = new QLabel;

    frmLabel = new QLabel(tr("FrameGeometry(): "));
    frmValueLabel = new QLabel;

    posLabel = new QLabel(tr("Pos(): "));
    posValueLabel = new QLabel;

    geoLabel = new QLabel(tr("Geometry(): "));
    geoValueLabel = new QLabel;

    widthLabel = new QLabel(tr("Width(): "));
    widthValueLabel = new QLabel;

    heightLabel = new QLabel(tr("Height(): "));
    heightValueLabel = new QLabel;

    rectLabel = new QLabel(tr("Rect(): "));
    rectValueLabel = new QLabel;

    sizeLabel = new QLabel(tr("Size(): "));
    sizeValueLabel = new QLabel;

    mainLayout = new QGridLayout(this);

    mainLayout->addWidget(xLabel,0,0);
    mainLayout->addWidget(xValueLabel,0,1);

    mainLayout->addWidget(yLabel,1,0);
    mainLayout->addWidget(yValueLabel,1,1);

    mainLayout->addWidget(posLabel,2,0);
    mainLayout->addWidget(posValueLabel,2,1);

    mainLayout->addWidget(frmLabel,3,0);
    mainLayout->addWidget(frmValueLabel,3,1);

    mainLayout->addWidget(geoLabel,4,0);
    mainLayout->addWidget(geoValueLabel,4,1);

    mainLayout->addWidget(widthLabel,5,0);
    mainLayout->addWidget(widthValueLabel,5,1);

    mainLayout->addWidget(heightLabel,6,0);
    mainLayout->addWidget(heightValueLabel,6,1);

    mainLayout->addWidget(rectLabel,7,0);
    mainLayout->addWidget(rectValueLabel,7,1);

    mainLayout->addWidget(sizeLabel,8,0);
    mainLayout->addWidget(sizeValueLabel,8,1);

    updateLabel();  //更新控件

}

Dialog::~Dialog()
{

}

void Dialog::updateLabel()
{
    QString xStr;
    xValueLabel->setText(xStr.setNum(x())); //获取整个窗体左上角的位置

    QString yStr;
    yValueLabel->setText(yStr.setNum(y())); //获取整个窗体左上角的位置

    QString frameStr;   //获取整个窗体左上角的位置和长宽值
    QString tempStr1,tempStr2,tempStr3,tempStr4;
    frameStr = tempStr1.setNum(frameGeometry().x()) + "," +
            tempStr2.setNum(frameGeometry().y()) + "," +
            tempStr3.setNum(frameGeometry().width()) + ","+
            tempStr4.setNum(frameGeometry().height());
    frmValueLabel->setText(frameStr);

    QString geoStr; //获取窗体中央区域的左上角位置和长宽值
    QString tempStr21,tempStr22,tempStr23,tempStr24;
    geoStr = tempStr21.setNum(geometry().x()) + "," +
            tempStr22.setNum(geometry().y()) + ","  +
            tempStr23.setNum(geometry().width()) + "," +
            tempStr24.setNum(geometry().height());
    geoValueLabel->setText(geoStr);

    QString positionStr;    //获取窗体左上角的位置
    QString tempStr11,tempStr12;
    positionStr = tempStr11.setNum(pos().x()) + "," +
            tempStr12.setNum(pos().y());
    posValueLabel->setText(positionStr);

    QString wStr,hStr;  //获取窗体中央区域的长宽值
    widthValueLabel->setText(wStr.setNum(width()));
    heightValueLabel->setText(hStr.setNum(height()));

    QString rectStr;    //获取窗体中央区域的左上角值和长宽值
    QString tempStr31,tempStr32,tempStr33,tempStr34;
    rectStr = tempStr31.setNum(rect().x()) + "," +
            tempStr32.setNum(rect().y()) + "," +
            tempStr33.setNum(rect().width()) + "," +
            tempStr34.setNum(rect().height());
    rectValueLabel->setText(rectStr);

    QString sizeStr;    //获取窗体中央区域的长宽值
    QString tempStr41,tempStr42;
    sizeStr = tempStr41.setNum(size().width()) + "," +
            tempStr42.setNum(size().height());
    sizeValueLabel->setText(sizeStr);

}

void Dialog::moveEvent(QMoveEvent *)
{
    updateLabel();
}

void Dialog::resizeEvent(QResizeEvent *)
{
    updateLabel();
}

http://blog.csdn.net/rl529014/article/details/51645440

时间: 2024-08-08 12:27:58

Qt5位置相关函数异同详解(附源码)的相关文章

转载—— android 瀑布流的实现详解,附源码

介绍 参考自:https://github.com/dodola/android_waterfall,因为原来的代码封装不好,所以,我根据源码的思路,重新写了一遍,所以有了现在这个项目:https://github.com/youxilua/waterfall4android 原作者表示: 试过在1万张可以流畅的滑动,不出现内存溢出情况 设计思路 之前的作者的自定义view 只有主滑动一层,其他的设置要在相应的活动设置,个人觉得,重用起来比较麻烦,所以决定封装一层.现在定义一个默认的瀑布流只需5

struts2内置拦截器和自定义拦截器详解(附源码)

一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截器,拦截器才可以正常的工作和运行.Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现.大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与 拦截器链的配置.内置拦截器虽然在struts2中都定义了,但是并不是都起作用的.因为并不是所有拦截器都被加

Android-多线程断点下载详解及源码下载(三)

本项目完成的功能类似与迅雷等下载工具所实现的功能--实现多线程断点下载. 主要设计的技术有: 1.android中主线程与非主线程通信机制. 2.多线程的编程和管理. 3.android网络编程 4.自己设计实现设计模式-监听器模式 5.Activity.Service.数据库编程 6.android文件系统 7.缓存 博文链接: Android-多线程断点下载详解及源码下载(一) Android-多线程断点下载详解及源码下载(二) Android-多线程断点下载详解及源码下载(四) 本篇接着上

RN FlatList使用详解及源码解析

FlatList使用详解及源码解析 前言 长列表或者无限下拉列表是最常见的应用场景之一.RN 提供的 ListView 组件,在长列表这种数据量大的场景下,性能堪忧.而在最新的 0.43 版本中,提供了 FlatList 组件,或许就是你需要的高性能长列表解决方案.它足以应对大多数的长列表场景. 一.功能简介 FlatList高性能的简单列表组件,支持下面这些常用的功能: 完全跨平台. 支持水平布局模式. 行组件显示或隐藏时可配置回调事件. 支持单独的头部组件. 支持单独的尾部组件. 支持自定义

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

详解LAMP源码编译安装

实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MySQL 四.编译安装 PHP 测试LAMP搭建开源数据web管理程序phpMyadmin 详解LAMP源码编译安装 LAMP简介 LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装L

Android触摸屏事件派发机制详解与源码分析

请看下面三篇博客,思路还是蛮清晰的,不过还是没写自定义控件系列哥们的思路清晰: Android触摸屏事件派发机制详解与源码分析一(View篇) http://blog.csdn.net/yanbober/article/details/45887547 Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇) http://blog.csdn.net/yanbober/article/details/45912661 Android触摸屏事件派发机制详解与源码分析三(Activi

SpringMVC视图机制详解[附带源码分析]

目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本文将分析SpringMVC的视图这部分内容,让读者了解SpringMVC视图的设计原理. 重要接口和类介绍 1. View接口 视图基础接口,它的各种实现类是无

Android ViewGroup触摸屏事件派发机制详解与源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 该篇承接上一篇<Android View触摸屏事件派发机制详解与源码分析>,阅读本篇之前建议先阅读. 1 背景 还记得前一篇<Android View触摸屏事件派发机制详解与源码分析>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事