您当前的位置: 首页 >  qt

令狐掌门

暂无认证

  • 0浏览

    0关注

    513博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

令狐掌门 发布时间:2021-09-04 16:06:59 ,浏览量:0

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

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

  先声明两个名词:

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

  在讨论各种位置之前,我们需要了解电脑桌面坐标系、应用程序坐标系。一般都是规定左上角为坐标原点,水平向右为x正,竖直向下为y正,如下图: 在这里插入图片描述   比如我的电脑屏幕是2500*1600,对于桌面坐标系,左边是0,右边是2500,上面是0,下面是1600。

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

#pragma once

#include 
#include "ui_Qt_Pos.h"

class Qt_Pos : public QMainWindow
{
    Q_OBJECT

public:
    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 

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.

关注
打赏
1652240117
查看更多评论
立即登录/注册

微信扫码登录

0.0405s