按键事件
#include "qeventtest.h"
#include <QDebug>
#include<QEvent>
#include <QKeyEvent>
QEventTest::QEventTest(QWidget* parent)
: QWidget(parent)
{
ui.setupUi(this);
//this->setMouseTracking(true);
}
bool QEventTest::event(QEvent* ev)
{
if (ev->type() == QEvent::KeyPress)
{
QKeyEvent* ke = static_cast<QKeyEvent*>(ev);
if (ke->key() == 'A')
{
//自动连按事件,不处理
if (!ke->isAutoRepeat())
qDebug() << "aaaaaaaaaaaaaaaaaaa";
return true;
}
}
return QWidget::event(ev);
}
void QEventTest::keyPressEvent(QKeyEvent* ev)
{
//自动连按事件,不处理
if (ev->isAutoRepeat()) return;
if (ev->key() == Qt::Key_F1)
{
qDebug() << "Key_F1";
}
qDebug() << "keyPressEvent = " << ev->key();
}
//键盘松开
void QEventTest::keyReleaseEvent(QKeyEvent* ev)
{
//自动连按事件,不处理
if (ev->isAutoRepeat()) return;
qDebug() << "keyReleaseEvent = " << ev->key();
}
鼠标位置坐标 & 鼠标按键事件
提示QLabel为XLabel
.h
#include <QLabel>
#include <QDebug>
#include <QMouseEvent>
#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();
}
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();
}
};
.cpp
#include "xlabel.h"
#include <QEvent>
#include<QMouseEvent>
#include <QDebug>
XLabel::XLabel(QWidget *parent)
: QLabel(parent)
{
this->setMouseTracking(true);
menu.addAction(QStringLiteral("菜单1"));
menu.addAction(QStringLiteral("菜单2"));
menu.addAction(QStringLiteral("菜单3"));
}
XLabel::~XLabel()
{
}
bool XLabel::event(QEvent *ev)
{
if (ev->type() == QEvent::MouseButtonPress)
{
QMouseEvent *me = static_cast<QMouseEvent*> (ev);
相对坐标
qDebug() << "LocalPos " << me->x() << ":" << me->y();
//程序坐标
qDebug() << "windowPos " << me->windowPos().x() << ":" << me->windowPos().y();
//屏幕坐标
qDebug() << "screenPos " << me->screenPos().x() << ":" << me->screenPos().y();
//本地坐标转全局(屏幕坐标)
QPoint gpos = mapToGlobal(me->pos());
qDebug() << "mapToGlobal " << gpos.x() << ":" << gpos.y();
//获取鼠标的屏幕坐标
qDebug() << "QCursor " << QCursor::pos().x() <<":" << QCursor::pos().y();
//鼠标按键事件
if (me->buttons() & Qt::LeftButton)
{
qDebug() << "LeftButton";
setCursor(Qt::ArrowCursor);
}
if (me->buttons() & Qt::RightButton)
{
qDebug() << "RightButton";
//右键菜单
menu.exec(gpos);
}
if (me->buttons() & Qt::MidButton)
{
qDebug() << "MidButton";
}
//左右键同时按下
if ( (me->buttons() & Qt::LeftButton) && (me->buttons() & Qt::RightButton) )
{
qDebug() << "LeftButton&RightButton";
//鼠标图标替换 -1 -1 热点中间
QPixmap pix("cursor.png");
QCursor cur = QCursor(pix, -1, -1);
setCursor(cur);
}
}
return QWidget::event(ev);
}
窗体大小重载事件
.h
#include <QtWidgets/QWidget>
#include "ui_TestQResizeEvent.h"
class TestQResizeEvent : public QWidget
{
Q_OBJECT
public:
TestQResizeEvent(QWidget *parent = Q_NULLPTR);
bool event(QEvent *e);
void resizeEvent(QResizeEvent *ev)
{
ui.label->resize(width(), height() - ui.label->y());
}
private:
Ui::TestQResizeEventClass ui;
};
.cpp
#include "TestQResizeEvent.h"
#include <QResizeEvent>
#include <QDebug>
TestQResizeEvent::TestQResizeEvent(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
bool TestQResizeEvent::event(QEvent *e)
{
if (e->type() == QEvent::Resize)
{
QResizeEvent *re = static_cast<QResizeEvent *>(e);
qDebug() << "Resize old" << re->oldSize().width() << ":" << re->oldSize().height()
<< " new size" << re->size().width() << ":" << re->size().height();
}
return QWidget::event(e);
}