QT::TestMouseEvent操作
前言:
本文操作均为在vs2015+QT5.9.5版本中执行
头文件:testmouseevent.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_testmouseevent.h"
class TestMouseEvent : public QWidget
{
Q_OBJECT
public:
TestMouseEvent(QWidget *parent = Q_NULLPTR);
bool event(QEvent *ev);
private:
Ui::TestMouseEventClass ui;
};
头文件:xlabel.h
#pragma once
#include <QLabel>
#include<QMouseEvent>
#include<QDebug>
#include <QMenu>
class XLabel : public QLabel
{
Q_OBJECT
public:
QMenu menu;
XLabel(QWidget *parent);
~XLabel();
bool event(QEvent *ev);
//鼠标进入事件
virtual void enterEvent(QEvent *event)
{
qDebug() << "enterEvent";
}
//鼠标离开事件
virtual void leaveEvent(QEvent *event)
{
qDebug() << "leaveEvent";
}
//鼠标双击事件
virtual void mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug() << "mouseDoubleClickEvent" << event->pos().x() << ":" << event->pos().y();
}
//鼠标移动事件:PS;未开启鼠标追踪,需要按住移动。
virtual void mouseMoveEvent(QMouseEvent *event)
{
qDebug() << "mouseMoveEvent" << event->pos().x() << ":" << event->pos().y();
}
//鼠标按住事件
virtual void mousePressEvent(QMouseEvent *event)
{
qDebug() << "mousePressEvent" << event->pos().x() << ":" << event->pos().y();
}
//鼠标松开事件
virtual void mouseReleaseEvent(QMouseEvent *event)
{
qDebug() << "mouseReleaseEvent" << event->pos().x() << ":" << event->pos().y();
}
};
UI文件:testmouseevent.ui
/********************************************************************************
** Form generated from reading UI file 'testmouseevent.ui'
**
** Created by: Qt User Interface Compiler version 5.9.5
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_TESTMOUSEEVENT_H
#define UI_TESTMOUSEEVENT_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QWidget>
#include "xlabel.h"
QT_BEGIN_NAMESPACE
class Ui_TestMouseEventClass
{
public:
XLabel *label;
void setupUi(QWidget *TestMouseEventClass)
{
if (TestMouseEventClass->objectName().isEmpty())
TestMouseEventClass->setObjectName(QStringLiteral("TestMouseEventClass"));
TestMouseEventClass->resize(970, 601);
label = new XLabel(TestMouseEventClass);
label->setObjectName(QStringLiteral("label"));
label->setGeometry(QRect(260, 150, 400, 270));
label->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 255, 255);\n"
"font: 24pt \"\351\273\221\344\275\223\";"));
label->setAlignment(Qt::AlignCenter);
retranslateUi(TestMouseEventClass);
QMetaObject::connectSlotsByName(TestMouseEventClass);
} // setupUi
void retranslateUi(QWidget *TestMouseEventClass)
{
TestMouseEventClass->setWindowTitle(QApplication::translate("TestMouseEventClass", "TestMouseEvent", Q_NULLPTR));
label->setText(QApplication::translate("TestMouseEventClass", "\345\235\220\346\240\207\350\216\267\345\217\226\346\265\213\350\257\225", Q_NULLPTR));
} // retranslateUi
};
namespace Ui {
class TestMouseEventClass: public Ui_TestMouseEventClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_TESTMOUSEEVENT_H
主函数:main.cpp
#include "testmouseevent.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestMouseEvent w;
w.show();
return a.exec();
}
实现文件:testmouseevent.cpp
#include "testmouseevent.h"
#include <QMouseEvent>
#include <QDebug>
#include <QEvent>
TestMouseEvent::TestMouseEvent(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
bool TestMouseEvent::event(QEvent *ev)
{
//获取QEvent事件的类型(type),判断是否鼠标按钮按下
if (ev->type() == QEvent::MouseButtonPress)
{
/*
第一步:将“事件(QEvent)”类型转换为“鼠标事件(QMouseEvent)”类型;
第二步:获取鼠标按下的坐标
*/
QMouseEvent *me = static_cast<QMouseEvent *>(ev);
相对坐标:这是相对于当前“控件”或者“窗口”位置获取的坐标
//qDebug() << "MouseButtonPress" << me->x() << ":" << me->y();
程序坐标:获取当前程序的窗口坐标
//qDebug() << "windowPos" << me->windowPos().x() << ":" << me->windowPos().y();
获取全屏坐标:这是基于当前屏幕大小获取的坐标位置
//qDebug() << "screenPos" << me->screenPos().x() << ":" << me->screenPos().y();
}
return QWidget::event(ev);//激活QWidget里控件的所有事件
}
实现文件:xlabel.cpp
#include "xlabel.h"
#include <QMouseEvent>
#include <QDebug>
#include <QEvent>
XLabel::XLabel(QWidget *parent)
: QLabel(parent)
{
this->setMouseTracking(true);//打开鼠标追踪事件
menu.addAction(QString::fromLocal8Bit("菜单一"));
menu.addAction(QString::fromLocal8Bit("菜单二"));
menu.addAction(QString::fromLocal8Bit("菜单三"));
}
XLabel::~XLabel()
{
}
bool XLabel::event(QEvent *ev)
{
//获取QEvent事件的类型(type),判断是否鼠标按钮按下
if (ev->type() == QEvent::MouseButtonPress)
{
/*
第一步:将“事件(QEvent)”类型转换为“鼠标事件(QMouseEvent)”类型;
第二步:获取鼠标按下的坐标
*/
QMouseEvent *me = static_cast<QMouseEvent *>(ev);
//相对坐标:这是相对于当前控件位置获取的坐标
qDebug() << "XLabel::MouseButtonPress" << me->x() << ":" << me->y();
//程序坐标:获取当前程序的窗口坐标
qDebug() << "XLabel::windowPos" << me->windowPos().x() << ":" << me->windowPos().y();
//获取全屏坐标:这是基于当前屏幕大小获取的坐标位置
qDebug() << "XLabel::screenPos" << me->screenPos().x() << ":" << me->screenPos().y();
//本地坐标转换全局(全屏坐标):这个是将相对坐标位置转换为全屏坐标的
QPoint gpos = mapToGlobal(me->pos());//映射到全屏(mapToGlobal)类型为QPoint
qDebug() << "mapToGlobal" << gpos.x() << ":" << gpos.y();
//获取鼠标坐标:这个也是基于当前屏幕大小获取的坐标位置
qDebug() << "QCursor" << QCursor::pos().x() << ":" << QCursor::pos().y();
}
//判断鼠标左键、右键、中间件响应事件测试
if(ev->type() == QEvent::MouseButtonPress)
{
QMouseEvent *me = static_cast<QMouseEvent *>(ev);
QPoint pi = mapToGlobal(me->pos());//转换相对坐标为全屏幕坐标
if (me->buttons() == Qt::LeftButton)//鼠标左击事件
{
qDebug() << "LeftButton";
//更换鼠标样式
QCursor cursor;
QPixmap pixmap("amplification.png");
QPixmap scaledPixmap= pixmap.scaled(QSize(28, 28),Qt::KeepAspectRatio);//设定图片大小
cursor = QCursor(scaledPixmap, -1, -1);//设定图标点击的响应位置
setCursor(cursor);
}
if (me->buttons() == Qt::RightButton)//鼠标右击事件
{
qDebug() << "RightButton";
//恢复鼠标默认样式
setCursor(Qt::ArrowCursor);
//获取全屏的坐标来跟随着鼠标点击显示菜单
menu.exec(pi);
}
if (me->buttons() == Qt::MidButton)//鼠标中间键
{
qDebug() << "MidButton";
}
//鼠标同时按下事件(PS:可以一边长按后在按下另一个按键一样触发)
if ((me->buttons() & Qt::LeftButton) && (me->buttons() & Qt::RightButton))
{
qDebug() << "LeftButton And RightButton";
}
}
return QWidget::event(ev);//激活QWidget里控件的所有事件
}