Qt-QEvent

20 篇文章 0 订阅

按键事件

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值