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);
//}
该程序改编后仅仅是将坐标原点改成了空间左下角坐标,其余像素坐标都是基于原点取的,尚未加入鼠标移动超出控件后鼠标位置不显示程序,因为影响不大,重点关注空间内像素坐标就可以了
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);
}
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();