提交 258a26bb 编写于 作者: mahuifa's avatar mahuifa

fix:修改QMouseEvent和QKeyEvent发送问题

    1、由于Linux下Qt不允许使用信号传递QMouseEvent、QKeyEvent等信号,所以只能改为使用指针传递;
    2、开始编写Linux下x11监听全局键盘事件。
上级 7f622a5e
......@@ -6,6 +6,7 @@ HEADERS += \
SOURCES += \
$$PWD/globalkeyevent_win.cpp \
$$PWD/globalkeyevent_x11.cpp \
$$PWD/globalmouseevent_win.cpp \ # windows全局鼠标事件监听器
$$PWD/globalmouseevent_x11.cpp # linux全局鼠标事件监听器
......
......@@ -2,7 +2,7 @@
#define GLOBALKEYEVENT_H
#include <QObject>
#include <QKeyEvent>
class QKeyEvent;
/**
* 全局鼠标事件单例信号类
......@@ -21,7 +21,11 @@ public:
static bool removeKeyEvent(); // 卸载全局键盘事件监听器
signals:
void keyEvent(QKeyEvent event);
/**
* @brief 由于传递的是指针,为了保证不会出现内存泄露,需要在槽函数中delete。
* 建议此信号只绑定一次,因为如果绑定多次可能会出现一个槽函数里把信号delete了,另外一个槽函数还在使用,出现野指针,或者多个槽函数多次delete
*/
void keyEvent(QKeyEvent* event);
private:
GlobalKeyEvent(){}
......
......@@ -292,7 +292,8 @@ static const uint KeyTbl[] = { // Keyboard mapping table
Qt::Key_Clear, // 254 0xFE VK_OEM_CLEAR | Clear key
0
};
inline quint32 winceKeyBend(quint32 keyCode)
static inline quint32 winceKeyBend(quint32 keyCode)
{
return KeyTbl[keyCode];
}
......@@ -301,7 +302,7 @@ inline quint32 winceKeyBend(quint32 keyCode)
* @brief 获取是否按下键盘修饰键,例如Ctrl、shirt等
* @return
*/
inline Qt::KeyboardModifiers queryKeyboardModifiers()
static inline Qt::KeyboardModifiers queryKeyboardModifiers()
{
Qt::KeyboardModifiers modifiers = Qt::NoModifier;
if (GetKeyState(VK_SHIFT) < 0)
......@@ -325,7 +326,7 @@ static uchar g_buffer[256];
* @param isDeadkey
* @return
*/
inline quint32 toKeyOrUnicode(quint32 vk, quint32 scancode, bool *isDeadkey = nullptr)
static inline quint32 toKeyOrUnicode(quint32 vk, quint32 scancode, bool *isDeadkey = nullptr)
{
Q_ASSERT(vk > 0 && vk < 256);
......@@ -380,7 +381,7 @@ static uchar g_keyState[256];
* @param scancode 要转换的密钥的硬件扫描代码
* @return
*/
inline QString getKeyText(quint32 vk, quint32 scancode)
static inline QString getKeyText(quint32 vk, quint32 scancode)
{
GetKeyboardState(g_keyState); // 将 256 个虚拟密钥的状态复制到指定的缓冲区。
wchar_t newKey[3] = {0};
......@@ -408,7 +409,7 @@ inline QString getKeyText(quint32 vk, quint32 scancode)
* @param flags
* @return
*/
quint32 getNativeModifiers(quint32 flags)
static quint32 getNativeModifiers(quint32 flags)
{
quint32 nModifiers = 0;
......@@ -459,19 +460,19 @@ LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
case WM_KEYDOWN: // 按下非系统键, 非系统键是未按下 ALT 键时按下的键
{
emit GlobalKeyEvent::getInstance()->keyEvent(QKeyEvent(QEvent::KeyPress, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, autorep));
emit GlobalKeyEvent::getInstance()->keyEvent(new QKeyEvent(QEvent::KeyPress, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, autorep));
break;
}
case WM_KEYUP: // 当释放非系统键
emit GlobalKeyEvent::getInstance()->keyEvent(QKeyEvent(QEvent::KeyRelease, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, !autorep));
emit GlobalKeyEvent::getInstance()->keyEvent(new QKeyEvent(QEvent::KeyRelease, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, !autorep));
break;
case WM_SYSKEYDOWN: // 当用户按下 F10 键 (激活菜单栏) 或按住 Alt 键,然后按另一个键时,发布到具有键盘焦点的窗口
qDebug() << "按下系统键 Alt";
emit GlobalKeyEvent::getInstance()->keyEvent(QKeyEvent(QEvent::KeyPress, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, autorep));
emit GlobalKeyEvent::getInstance()->keyEvent(new QKeyEvent(QEvent::KeyPress, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, autorep));
break;
case WM_SYSKEYUP: // 当用户释放按下 Alt 键时按下的键
qDebug() << "释放系统键 Alt";
emit GlobalKeyEvent::getInstance()->keyEvent(QKeyEvent(QEvent::KeyRelease, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, !autorep));
emit GlobalKeyEvent::getInstance()->keyEvent(new QKeyEvent(QEvent::KeyRelease, key, modifiers, kbdll->scanCode, kbdll->vkCode, nativeModifiers, text, !autorep));
break;
default:
break;
......
#include "globalkeyevent.h"
#if defined(Q_OS_LINUX)
#include <QtConcurrent>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/record.h> // 如果找不到可以安装sudo apt-get install xorg-dev
#include <X11/Xlibint.h>
static XRecordContext g_context = 0;
static Display* g_display = nullptr;
static bool init()
{
g_display =XOpenDisplay(nullptr); // 打开与控制显示器的X服务器的连接,详细说明看【https://tronche.com/gui/x/xlib/display/opening.html】
if(!g_display)
{
qWarning() << "连接X服务失败!";
return false;
}
XRecordClientSpec clients = XRecordAllClients; // 初始化 XRecordCreateContext 所需的 XRecordClientSpec 参数,XRecordAllClients 的意思是 "记录所有 X Client" 的事件
XRecordRange*range = XRecordAllocRange(); // 创建 XRecordRange 变量,用于控制记录事件的范围
if (!range)
{
qDebug() << "无法分配XRecordRange";
return false;
}
// 会监听到 first - last之间并包含first和last的所有类型的事件
memset(range, 0, sizeof(XRecordRange));
range->device_events.first = KeyPress;
range->device_events.last = KeyRelease;
// 根据上面的记录客户端类型和记录事件范围来创建 “记录上下文”
// 然后把 XRecordContext 传递给 XRecordEnableContext 函数来开启事件记录循环
g_context = XRecordCreateContext(g_display, 0, &clients, 1,&range, 1);
XFree(range);
if(g_context == 0)
{
qWarning() << "创建事件记录上下文失败!";
return false;
}
XSync(g_display, false); // XSync 的作用就是把上面的X 代码立即发给 X Server,这样 X Server 接受到事件以后会立即发送给 XRecord 的 Client 连接 True
return true;
}
/**
* @brief 处理鼠标事件的回调函数,将X11鼠标事件转换为Qt鼠标事件,通过单例类MouseEvent发送出去
* @param ptr
* @param data
*/
static void callback(XPointer ptr, XRecordInterceptData* data)
{
Q_UNUSED(ptr)
if (data->category == XRecordFromServer)
{
xEvent * event = reinterpret_cast<xEvent*>(data->data);
// qDebug() << QString("鼠标坐标:[%1, %2]").arg(event->u.keyButtonPointer.rootX).arg(event->u.keyButtonPointer.rootY); // 获取鼠标坐标
switch (event->u.u.type) // 动作类型
{
case KeyPress: // 键盘按下
{
// QPoint point = QCursor::pos(); // 获取鼠标当前位置
qDebug() << event->u.u.detail;
switch (event->u.u.detail) // 按键类型
{
case Button1: // 左键按下
{
// emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
break;
}
case Button2: // 中键按下
{
// emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
break;
}
case Button3: // 右键按下
{
// emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
break;
}
case Button4: // 向前滚动
{
// emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, 120, Qt::MiddleButton, Qt::NoModifier));
break;
}
case Button5: // 向后滚动
{
// emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, -120, Qt::MiddleButton, Qt::NoModifier));
break;
}
default:
{
qDebug() << QString("未定义的按键:%1").arg(event->u.u.detail); // 比如很多鼠标边上会多几个键
break;
}
}
break;
}
case KeyRelease: // 键盘释放
{
// QPoint point = QCursor::pos(); // 获取鼠标当前位置
switch (event->u.u.detail) // 按键类型
{
case Button1: // 左键释放
{
// emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
break;
}
case Button2: // 中键释放
{
// emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
break;
}
case Button3: // 右键释放
{
// emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
break;
}
case Button4: // 向前滚动
{
break;
}
case Button5: // 向后滚动
{
break;
}
default:
{
// qDebug() << QString("未定义的按键:%1").arg(event->u.u.detail); // 比如很多鼠标边上会多几个键
}
}
break;
}
default:
break;
}
}
XRecordFreeData(data);
}
/**
* 调用 XRecordEnableContext 函数建立 XRecord 上下文
* X Server 事件一旦发生就传递给事件处理回调函数
* XRecordEnableContext 函数一旦调用就开始进入堵塞时的事件循环,直到线程或所属进程结束
*/
static void enableContext()
{
Status ret = XRecordEnableContext(g_display, g_context, callback, nullptr);
XCloseDisplay(g_display); // 关闭连接
g_display = nullptr;
qDebug() << QString("退出键盘事件监听:%1").arg(ret);
}
/**
* @brief 安装全局键盘事件监听器
* @return
*/
bool GlobalKeyEvent::installKeyEvent()
{
bool ret = init();
if(!ret) return false;
QtConcurrent::run(enableContext); // 由于XRecordEnableContext会一直阻塞,所以需要在线程中调用
return true;
}
/**
* @brief 卸载全局键盘事件监听器
* @return
*/
bool GlobalKeyEvent::removeKeyEvent()
{
if(g_context == 0) return false;
Display* display = XOpenDisplay(nullptr); // 这里需要单独建立一个连接来关闭监听,否则XRecordEnableContext不会退出
if(!display)
{
qWarning() << "连接X服务失败!";
return false;
}
XRecordDisableContext(display, g_context);
XFlush(display);
XSync(display, false);
XRecordFreeContext(display, g_context); // 释放监听上下文,否则XRecordEnableContext不会退出
g_context = 0;
XCloseDisplay(display);
return true;
}
#endif
......@@ -11,7 +11,10 @@
#define MOUSEEVENT_H
#include <QObject>
#include <QMouseEvent>
class QMouseEvent;
class QWheelEvent;
/**
* 全局鼠标事件单例信号类
*/
......@@ -29,8 +32,12 @@ public:
static bool removeMouseEvent(); // 卸载全局鼠标事件监听器
signals:
void mouseEvent(QMouseEvent event);
void wheelEvent(QWheelEvent event);
/**
* @brief 由于传递的是指针,为了保证不会出现内存泄露,需要在槽函数中delete。
* 建议此信号只绑定一次,因为如果绑定多次可能会出现一个槽函数里把信号delete了,另外一个槽函数还在使用,出现野指针,或者多个槽函数多次delete
*/
void mouseEvent(QMouseEvent* event);
void wheelEvent(QWheelEvent* event);
private:
GlobalMouseEvent(){}
......
......@@ -19,30 +19,29 @@ static HHOOK g_hook = nullptr;
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
QPoint point = QCursor::pos(); // 获取鼠标当前位置
qDebug() << wParam;
switch (wParam)
{
case WM_LBUTTONDOWN: // 鼠标左键按下
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
break;
case WM_MOUSEMOVE: // 鼠标移动
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseMove, point, Qt::NoButton, Qt::NoButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseMove, point, Qt::NoButton, Qt::NoButton, Qt::NoModifier));
break;
case WM_RBUTTONDOWN: // 鼠标右键按下
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
break;
case WM_RBUTTONUP: // 鼠标右键抬起
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonRelease, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
break;
case WM_LBUTTONUP: // 鼠标左键抬起
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonRelease, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
break;
case WM_MOUSEWHEEL: // 鼠标滚轮
{
MSLLHOOKSTRUCT * msll = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam);
// qDebug() << QString("坐标:(%1, %2)").arg(msll->pt.x).arg(msll->pt.y); // 获取鼠标坐标
int delta = GET_WHEEL_DELTA_WPARAM(msll->mouseData); // 获取滚轮状态,向前:120,向后-120
emit GlobalMouseEvent::getInstance()->wheelEvent(QWheelEvent(point, delta, Qt::MiddleButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, delta, Qt::MiddleButton, Qt::NoModifier));
break;
}
default:
......
......@@ -106,10 +106,11 @@ void MouseEventX11()
}
#else
XRecordContext g_context = 0;
Display* g_display = nullptr;
// 使用static修饰全局函数和全局变量:只能在本源文件使用
static XRecordContext g_context = 0;
static Display* g_display = nullptr;
bool init()
static bool init()
{
g_display =XOpenDisplay(nullptr); // 打开与控制显示器的X服务器的连接,详细说明看【https://tronche.com/gui/x/xlib/display/opening.html】
if(!g_display)
......@@ -148,7 +149,7 @@ bool init()
* @param ptr
* @param data
*/
void callback(XPointer ptr, XRecordInterceptData* data)
static void callback(XPointer ptr, XRecordInterceptData* data)
{
Q_UNUSED(ptr)
......@@ -165,27 +166,27 @@ void callback(XPointer ptr, XRecordInterceptData* data)
{
case Button1: // 左键按下
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
break;
}
case Button2: // 中键按下
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonPress, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
break;
}
case Button3: // 右键按下
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
break;
}
case Button4: // 向前滚动
{
emit GlobalMouseEvent::getInstance()->wheelEvent(QWheelEvent(point, 120, Qt::MiddleButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, 120, Qt::MiddleButton, Qt::NoModifier));
break;
}
case Button5: // 向后滚动
{
emit GlobalMouseEvent::getInstance()->wheelEvent(QWheelEvent(point, -120, Qt::MiddleButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->wheelEvent(new QWheelEvent(point, -120, Qt::MiddleButton, Qt::NoModifier));
break;
}
default:
......@@ -198,7 +199,7 @@ void callback(XPointer ptr, XRecordInterceptData* data)
}
case MotionNotify: // 鼠标移动
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseMove, QCursor::pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseMove, QCursor::pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier));
}
case ButtonRelease: // 鼠标释放
{
......@@ -207,17 +208,17 @@ void callback(XPointer ptr, XRecordInterceptData* data)
{
case Button1: // 左键释放
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonRelease, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
break;
}
case Button2: // 中键释放
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonRelease, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::MiddleButton, Qt::MiddleButton, Qt::NoModifier));
break;
}
case Button3: // 右键释放
{
emit GlobalMouseEvent::getInstance()->mouseEvent(QMouseEvent(QEvent::MouseButtonRelease, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
emit GlobalMouseEvent::getInstance()->mouseEvent(new QMouseEvent(QEvent::MouseButtonRelease, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier));
break;
}
case Button4: // 向前滚动
......@@ -248,7 +249,7 @@ void callback(XPointer ptr, XRecordInterceptData* data)
* X Server 事件一旦发生就传递给事件处理回调函数
* XRecordEnableContext 函数一旦调用就开始进入堵塞时的事件循环,直到线程或所属进程结束
*/
void enableContext()
static void enableContext()
{
Status ret = XRecordEnableContext(g_display, g_context, callback, nullptr);
XCloseDisplay(g_display); // 关闭连接
......
......@@ -36,7 +36,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
# 定义程序版本号
VERSION = 1.5.0
VERSION = 1.6.0
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
contains(QT_ARCH, i386){ # 使用32位编译器
......
......@@ -2,7 +2,7 @@
#include "ui_widget.h"
#include <QDebug>
#include <QMetaEnum>
#include "globalmouseevent.h"
#include <globalmouseevent.h>
#include "globalkeyevent.h"
Widget::Widget(QWidget *parent)
......@@ -19,6 +19,10 @@ Widget::Widget(QWidget *parent)
Widget::~Widget()
{
#if defined(Q_OS_LINUX)
GlobalMouseEvent::removeMouseEvent();
GlobalKeyEvent::removeKeyEvent();
#endif
delete ui;
}
......@@ -26,14 +30,14 @@ Widget::~Widget()
* @brief 全局鼠标事件
* @param event
*/
void Widget::on_mouseEvent(QMouseEvent event)
void Widget::on_mouseEvent(QMouseEvent* event)
{
switch (event.type())
switch (event->type())
{
case QEvent::MouseButtonPress: // 鼠标按下
{
QString but;
switch (event.button())
switch (event->button())
{
case Qt::LeftButton:
{
......@@ -56,20 +60,20 @@ void Widget::on_mouseEvent(QMouseEvent event)
break;
}
}
QString str = QString("鼠标%1按下:(x:%2, y:%3)").arg(but).arg(event.x()).arg(event.y());
QString str = QString("鼠标%1按下:(x:%2, y:%3)").arg(but).arg(event->x()).arg(event->y());
ui->textEdit->append(str);
break;
}
case QEvent::MouseMove: // 鼠标移动
{
QString str = QString("鼠标移动:(x:%1, y:%2)").arg(event.x()).arg(event.y());
QString str = QString("鼠标移动:(x:%1, y:%2)").arg(event->x()).arg(event->y());
ui->textEdit->append(str);
break;
}
case QEvent::MouseButtonRelease: // 鼠标右键抬起
{
QString but;
switch (event.button())
switch (event->button())
{
case Qt::LeftButton:
{
......@@ -92,24 +96,25 @@ void Widget::on_mouseEvent(QMouseEvent event)
break;
}
}
QString str = QString("鼠标%1释放:(x:%2, y:%3)").arg(but).arg(event.x()).arg(event.y());
QString str = QString("鼠标%1释放:(x:%2, y:%3)").arg(but).arg(event->x()).arg(event->y());
ui->textEdit->append(str);
break;
}
default:
break;
}
delete event; // 使用完成后记得delete
}
/**
* @brief 全局鼠标滚轮事件
* @param event
*/
void Widget::on_wheelEvent(QWheelEvent event)
void Widget::on_wheelEvent(QWheelEvent* event)
{
QString str = QString("鼠标滚轮:%1,(x:%2, y:%3)").arg(event.delta() > 0 ? "向前" : "向后").arg(event.x()).arg(event.y());
QString str = QString("鼠标滚轮:%1,(x:%2, y:%3)").arg(event->delta() > 0 ? "向前" : "向后").arg(event->x()).arg(event->y());
ui->textEdit->append(str);
delete event; // 使用完成后记得delete
}
/**
......@@ -134,19 +139,20 @@ void Widget::on_but_mouser_clicked()
* @brief 全局键盘事件
* @param event
*/
void Widget::on_keyEvent(QKeyEvent event)
void Widget::on_keyEvent(QKeyEvent* event)
{
QMetaEnum type = QMetaEnum::fromType<QEvent::Type>();
QMetaEnum key = QMetaEnum::fromType<Qt::Key>();
QMetaEnum keyboard = QMetaEnum::fromType<Qt::KeyboardModifiers>();
QString str = QString("状态:[%1]\t按键:[%2]\t修饰:[%3]]").arg(type.valueToKey(event.type()))
.arg(key.valueToKey(event.key()))
.arg(QString(keyboard.valueToKeys(int(event.modifiers()))));
if(!event.text().isEmpty())
QString str = QString("状态:[%1]\t按键:[%2]\t修饰:[%3]]").arg(type.valueToKey(event->type()))
.arg(key.valueToKey(event->key()))
.arg(QString(keyboard.valueToKeys(int(event->modifiers()))));
if(!event->text().isEmpty())
{
str += QString("\t字符:[%1]").arg(event.text());
str += QString("\t字符:[%1]").arg(event->text());
}
ui->textEdit->append(str);
delete event; // 使用完成后记得delete
}
/**
......
......@@ -16,9 +16,9 @@ public:
~Widget();
private slots:
void on_mouseEvent(QMouseEvent event);
void on_wheelEvent(QWheelEvent event);
void on_keyEvent(QKeyEvent event);
void on_mouseEvent(QMouseEvent* event);
void on_wheelEvent(QWheelEvent* event);
void on_keyEvent(QKeyEvent* event);
void on_but_mouseI_clicked();
void on_but_mouser_clicked();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册