Qt中基于鼠标事件获取界面上坐标—鼠标点击,移动,释放

Qt中基于鼠标事件获取界面上坐标—鼠标点击,移动,释放

  • 以左上角为坐标原点显示全局像素坐标
  • 以label控件左下角为坐标原点显示鼠标在控件上坐标—加入了像素与经纬度坐标同时显示
  • 程序说明

以左上角为坐标原点显示全局像素坐标

Qt中默认左上角坐标为原点(0,0),x轴向右,y轴向下
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include //鼠标事件
#include //为鼠标事件添加标签
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QLabel *statusLabel;
    QLabel *MousePosLabel;
protected:
//    void mousePressEvent(QMouseEvent *e);//鼠标点击事件显示当前鼠标坐标位置
    void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件显示当前鼠标坐标位置
//    void mouseReleaseEvent(QMouseEvent *e);//鼠标释放事件显示当前鼠标坐标位置

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(tr("鼠标事件"));
    statusLabel=new QLabel;//用于显示鼠标移动时的实时位置
    statusLabel->setText(tr("当前位置"));
    statusLabel->setFixedWidth(100);

    MousePosLabel=new QLabel;
    MousePosLabel->setText(tr(""));
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);
    this->setMouseTracking(true);//设置窗体追踪鼠标
    qDebug()<label->pos();//获取空间左上角的位置坐标
}

MainWindow::~MainWindow()
{
    delete ui;
}
//void MainWindow::mousePressEvent(QMouseEvent *e)
//{
//    QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
//    if(e->button()==Qt::LeftButton)
//    {
//        statusBar()->showMessage(tr("左键")+str);
//    }
//    else if(e->button()==Qt::RightButton)
//    {
//         statusBar()->showMessage(tr("右键")+str);
//    }
//    else if (e->button()==Qt::MidButton)
//    {
//         statusBar()->showMessage(tr("中键")+str);
//    }
//}
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    //x1,y1为以label控件左上角为坐标原点获取lablel控件上的鼠标位置
    double x1=e->x()-ui->label->x();
    double y1=e->y()-ui->label->y();
    //x2,y2为以label控件左下角为坐标原点获取lablel控件上的鼠标位置
    double x2=x1;
    double y2=ui->label->height()-y1;
//    MousePosLabel->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");//全局坐标相对左上角
//    MousePosLabel->setText("("+QString::number(e->globalX())+","+QString::number(e->globalY())+")");//全局坐标相对最左上角
    MousePosLabel->setText("("+QString::number(x2)+","+QString::number(y2)+")");
}
//void MainWindow::mouseReleaseEvent(QMouseEvent *e)
//{
//    QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
//    statusBar()->showMessage(tr("释放在")+str,3000);
//}

Qt中基于鼠标事件获取界面上坐标—鼠标点击,移动,释放_第1张图片

以label控件左下角为坐标原点显示鼠标在控件上坐标—加入了像素与经纬度坐标同时显示

该程序改编后仅仅是将坐标原点改成了空间左下角坐标,其余像素坐标都是基于原点取的,尚未加入鼠标移动超出控件后鼠标位置不显示程序,因为影响不大,重点关注空间内像素坐标就可以了
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    //鼠标事件显示实时位置
    //像素坐标显示
    statusLabel=new QLabel;//用于显示鼠标移动时的实时位置
    statusLabel->setText(tr("当前位置像素坐标"));
    statusLabel->setFixedWidth(100);
    statusLabel2=new QLabel;//用于显示鼠标移动时的实时位置
    statusLabel2->setText(tr("经纬度坐标"));
    statusLabel2->setFixedWidth(100);
    //经纬度坐标实时显示
    JwLabel=new QLabel;
    JwLabel->setText(tr(""));
    JwLabel->setFixedWidth(100);
    MousePosLabel=new QLabel;
    MousePosLabel->setText(tr(""));
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);
    statusBar()->addPermanentWidget(MousePosLabel);
    statusBar()->addPermanentWidget(statusLabel2);
    statusBar()->addPermanentWidget(JwLabel);
}
//鼠标点击事件
//以label控件左下角为坐标原点实时显示鼠标当前位置
void MainWindow::mousePressEvent(QMouseEvent *e)
{
    //x1,y1为以label控件左上角为坐标原点获取lablel控件上的鼠标位置
    double x1=e->x()-ui->label_4->x();
    double y1=e->y()-ui->label_4->y();
    //x2,y2为以label控件左下角为坐标原点获取lablel控件上的鼠标位置
    double x2=x1;
    double y2=ui->label_4->height()-y1;
    // 平面坐标求取
    double xB=PixelCoordinatesToPingMianCoordinatesX(x1,y1);
    double yB=PixelCoordinatesToPingMianCoordinatesY(x1,y1);
    //经纬度坐标求取
    double Lat=PingMianCoordinatesToLatitude(xB,yB);
    double Lon=PingMianCoordinatesToLongitude(xB,yB);
    QString str="("+QString::number(x2)+","+QString::number(y2)+")"+" ";
    QString str1="("+QString::number(Lat)+","+QString::number(Lon)+")";
    if(e->button()==Qt::LeftButton)
    {
        statusBar()->showMessage(tr("左键像素坐标")+str+tr(" ")+tr("经纬度坐标")+str1);
    }
    else if(e->button()==Qt::RightButton)
    {
         statusBar()->showMessage(tr("右键像素坐标")+str+tr(" ")+tr("经纬度坐标")+str1);
    }
    else if (e->button()==Qt::MidButton)
    {
         statusBar()->showMessage(tr("中键像素坐标")+str+tr(" ")+tr("经纬度坐标")+str1);
    }
}
//鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    //x1,y1为以label控件左上角为坐标原点获取lablel控件上的鼠标位置
    double x1=e->x()-ui->label_4->x();
    double y1=e->y()-ui->label_4->y();
    //x2,y2为以label控件左下角为坐标原点获取lablel控件上的鼠标位置
    double x2=x1;
    double y2=ui->label_4->height()-y1;
    // 平面坐标求取
    double xB=PixelCoordinatesToPingMianCoordinatesX(x1,y1);
    double yB=PixelCoordinatesToPingMianCoordinatesY(x1,y1);
    //经纬度坐标求取
    double Lat=PingMianCoordinatesToLatitude(xB,yB);
    double Lon=PingMianCoordinatesToLongitude(xB,yB);
    MousePosLabel->setText("("+QString::number(x2)+","+QString::number(y2)+")");
    JwLabel->setText("("+QString::number(Lat)+","+QString::number(Lon)+")");
}
//鼠标释放事件
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
    //x1,y1为以label控件左上角为坐标原点获取lablel控件上的鼠标位置
        double x1=e->x()-ui->label_4->x();
        double y1=e->y()-ui->label_4->y();
        //x2,y2为以label控件左下角为坐标原点获取lablel控件上的鼠标位置
        double x2=x1;
        double y2=ui->label_4->height()-y1;
        // 平面坐标求取
        double xB=PixelCoordinatesToPingMianCoordinatesX(x1,y1);
        double yB=PixelCoordinatesToPingMianCoordinatesY(x1,y1);
        //经纬度坐标求取
        double Lat=PingMianCoordinatesToLatitude(xB,yB);
        double Lon=PingMianCoordinatesToLongitude(xB,yB);
        QString str="("+QString::number(x2)+","+QString::number(y2)+")"+" ";
        QString str1="("+QString::number(Lat)+","+QString::number(Lon)+")";
        statusBar()->showMessage(tr("释放在像素坐标")+str+tr(" ")+tr("经纬度坐标")+str1,3000);
}

Qt中基于鼠标事件获取界面上坐标—鼠标点击,移动,释放_第2张图片

程序说明

e->x() 整个窗口的左上角
ui->label_4->x() 以整个窗口左上角为原点的label控件左上角的坐标值
以下代码在转换坐标原点后仅在label控件中的像素值是正确的,超出该范围不对,由于仅在label控件内进行操作,因此仅考虑了该控件内的坐标值,超出该区域的错误像素值没有考虑

//x1,y1为以label控件左上角为坐标原点获取lablel控件上的鼠标位置
    double x1=e->x()-ui->label_4->x();
    double y1=e->y()-ui->label_4->y();

你可能感兴趣的:(Qt,自动驾驶)