目录

  • 坐标系
  • 鼠标位置
  • 控件位置
    • 控件的相对位置
    • 控件绝对位置
    • 控件的大小,rect
  • 窗口位置
    • 窗口的大小
    • 窗口绝对位置
    • 窗口相对位置
  • 总结

  在Qt界面开发时,有时需要根据鼠标位置,控件位置来确定小窗口的弹出位置,本篇博客来分析Qt的各种位置。

  先声明两个名词:

  • 绝对位置:相对于桌面窗口原点(0,0)的位置
  • 相对位置:相对于应用程序原点(0,0)的位置

坐标系

  在讨论各种位置之前,我们需要了解电脑桌面坐标系、应用程序坐标系。一般都是规定左上角为坐标原点,水平向右为x正,竖直向下为y正,如下图:

  比如我的电脑屏幕是2500*1600,对于桌面坐标系,左边是0,右边是2500,上面是0,下面是1600。

  创建一个Qt GUI项目,基于QMainWindow. 重写mousePressEvent函数,需要在这个函数里面来测试各种位置。

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_Qt_Pos.h"class Qt_Pos : public QMainWindow
{Q_OBJECTpublic:Qt_Pos(QWidget *parent = Q_NULLPTR);void mousePressEvent(QMouseEvent* event) override;private:Ui::Qt_PosClass ui;
};

鼠标位置

  先看电脑的显示分辨率

  与鼠标位置有关的3个方法

  • QCursor::pos() 的结果是鼠标相对于桌面的绝对位置
  • mousePressEvent的参数event的位置,event->pos() 是鼠标相对于应用程序的位置
  • event->globalPos() 相对于桌面原点的位置,绝对位置
      如下图:

    代码:
#include "Qt_Pos.h"
#include <QMouseEvent>Qt_Pos::Qt_Pos(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);
}void Qt_Pos::mousePressEvent(QMouseEvent* event)
{QPoint p1 = QCursor::pos();QString str1 = QString::number(p1.x()) + " , " + QString::number(p1.y());ui.lineEdit1->setText(str1);QPoint p2 = event->pos();QString str2 = QString::number(p2.x()) + " , " + QString::number(p2.y());ui.lineEdit2->setText(str2);QPoint p3 = event->globalPos();  //相对于桌面原点的位置QString str3 = QString::number(p3.x()) + " , " + QString::number(p3.y());ui.lineEdit3->setText(str3);
}

  鼠标的位置,主要是这三种,应该很清晰了。

控件位置

  有时需要根据某个控件的位置,弹出窗口,例如腾讯视频的音量调节按钮,如下图:

  在Qt里没有这种组合控件,需要自己来实现。无论应用程序在任何位置,音量调节小窗口始终在按钮的上方,那么就需要根据按钮的位置来确定弹出窗口的位置。下面来看看Qt是如何获取控件的位置。

  在界面上放一个按钮

控件的相对位置

代码:

QPoint p4 = ui.pushButton->pos();  //按钮控件相对于窗口原点的位置
QString str4 = QString::number(p4.x()) + " , " + QString::number(p4.y());
ui.lineEdit4->setText(str4);

控件绝对位置

  获取控件的绝对位置,需要调用mapToGlobal将控件位置转换到相对于全局桌面的坐标原点(0,0)的位置。

代码:

QPoint p5 = ui.pushButton->mapToGlobal(QPoint(0, 0));   //按钮相对于桌面原点的绝对位置
QString str5 = QString::number(p5.x()) + " , " + QString::number(p5.y());
ui.lineEdit5->setText(str5);

注意这个绝对位置是控件左上角相对于桌面原点的位置。

控件的大小,rect

代码:

QRect rect = ui.pushButton->rect();
QString str6 = QString::number(rect.width()) + " , " + QString::number(rect.height());
ui.lineEdit6->setText(str6);

窗口位置

下面代码以弹出的QDialog来测试

窗口的大小

代码:

QRect rect7 = m_pDlg->rect();

窗口绝对位置

 QRect rect8 = m_pDlg->geometry();  //对话框相对于桌面坐标原点的rect

注意这个绝对位置是窗口左上角相对于桌面原点的位置。

窗口相对位置

代码:

QPoint p9 = m_pDlg->pos();

总结

  经过以上的代码测试,基本把鼠标相对位置,绝对位置、控件相对位置,绝对位置,窗口的相对位置,绝对位置说清楚了,要实现鼠标悬浮按钮时弹出对话框这种功能也没什么难度了,比如腾讯视频的音量调节,选集功能,都是可以做的,就是要多几层信号emit.

Qt鼠标相对位置、绝对位置、窗口位置、控件位置、控件大小、控件绝对位置相关推荐

  1. java实用教程——组件及事件处理——设置组件的位置(相对于窗口具体位置和布局)

    1: 相对于窗口的具体位置 关键点: JButton组件添加到JPanel时,如果想自己位置,需要对JPanel进行如下设置,才能自定义按钮位置 需要将组件添加到画板上去,才可以设置组件的相对具体位置 ...

  2. Qt之无边框设计、鼠标移动窗体、子窗口阴影设计学习

    1)无边框设计代码如下,在构造函数中加入: setWindowFlags(Qt::FramelessWindowHint); //去掉系统边框,设置标志 2)子窗口阴影效果,如下代码: //阴影边框效 ...

  3. python第四个小程序,pygame移动的小坦克,支持键盘控制上下左右,F11全屏自动获取用户的最大分辨率,修改边框尺寸大小后初始化图片位置

    ###进击的坦克### import pygame import sys from pygame.locals import * #初始化Pygame pygame.init() size = wid ...

  4. R语言编写自定义函数自定义ggplot图像中的图例(legend)的位置、图例标题、键值、文本字体大小(title、text、key)、颜色标识的大小、点形状pch的大小

    R语言编写自定义函数自定义ggplot图像中的图例(legend)的位置.图例标题.键值.文本字体大小(title.text.key).颜色标识的大小.点形状pch的大小 目录

  5. 2.图像作为函数 | 图像的量化、大小、类型、位置以及Matlab使用_4

    目录 Matlab介绍 量化练习 图像大小和类型 检查像素值 Matlab介绍 对于本系列的任务都是用Matlab或Octave.我们讨论了如何使用Python和OpenCV等. Matlab或Oct ...

  6. html设置控件位置大小,下面那个代码段设置myButton控件显示在HTML页左上角100px的位置 - 问答库...

    问题: [多选] 下面那个代码段设置myButton控件显示在HTML页左上角100px的位置?() A . B . C . D . 调度例行会议形式有什么() 生产平衡会. 事故分析会. 调度专业会 ...

  7. QT鼠标悬停和点击功能

    一.效果展示  二.代码实现 childWidget.h #pragma once #include <QtWidgets/QWidget> #include <QStyleOpti ...

  8. Qt学习 第21节:窗口初始化EVENT

    1.WindowTitleChange 改变标题 2.Move 窗口位置改变(默认0,0) 3.WindowIconChange 改变图标 4.Resize 窗口大小改变(默认0) 5.show 窗口 ...

  9. Qt Widgets 之 QDockWidget(停靠窗口)

    目录 什么是停靠窗口 如何添加停靠窗口 QDockWidget::setWidget() QMainWindow::addDockWidget() 设置停靠选项 (Options) AnimatedD ...

  10. QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等

    QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等 框架搭建 UI设计 mp3.h mp3.cpp 隐藏窗口标题 最大化 最小化 关闭 框架搭建 .p ...

最新文章

  1. 搭建WordPress个人网站
  2. 纯Python包发布setup脚本编写示例
  3. VTK:Utilities之FilenameFunctions
  4. 上海市名校一年级数学考试附加题,难住学霸
  5. python sort函数返回值_python中 sort方法 和sorted函数
  6. 阿里飞猪一员工涉案66亿,非法获利千万;美图将加密货币作为价值储备;Linus警告不要用Linux5.12-rc1 | 极客头条...
  7. 点评2009年PHP十大图书(2)
  8. mpa和pis_压力单位pis、bar与Mpa换算
  9. oa软件测试用例,OA系统测试用例.doc
  10. 修复Joe主题静态资源为国内地址
  11. GridView自带分页 1/总页数 首页 下一页 上一页 尾页 X 页 go 实现方法
  12. iOS 利用 Metal 实现滤镜与动效滤镜
  13. Tecplot求涡量
  14. 车载微信助手,网页微信开发回顾
  15. 【stm32f429igt6】的WiFi模块数据收发。
  16. 01背包中背包装满和不装满
  17. 医疗健康大数据基础知识
  18. 【深度学习】【物联网】深度解读:深度学习在IoT大数据和流分析中的应用
  19. 计算机无法自动排列,为什么我的电脑不能自动排列图标
  20. mysql代码check约束_CHECK约束(示例代码)

热门文章

  1. 搭建自己的知识体系 自我提升
  2. 简单推导:关于矩阵主子式的几点性质
  3. dsf5.0没登录显示登录弹框
  4. 云端虚拟机规格参数快速对比说明
  5. I. Sequence
  6. Java操作word指定位置插入数据
  7. VS2017中配置QT5.12开发环境
  8. Android运用手机多媒体
  9. 都说建议新手用3Dmax,那到底学好3Dmax要多久呢?
  10. 多地力推企业上云,大力发展工业互联网|中机智库