Qt中的事件


// 处理键盘按键被按下事件
virtual void keyPressEvent(QKeyEvent *event) override;

// 处理键盘按键被释放事件
virtual void keyReleaseEvent(QKeyEvent *event) override;

// 处理鼠标双击事件
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;

// 处理鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent *event) override;

// 处理鼠标按下事件
virtual void mousePressEvent(QMouseEvent *event) override;

// 处理鼠标释放事件
virtual void mouseReleaseEvent(QMouseEvent *event) override;
#pragma once
#include <QWidget>
#include <QKeyEvent>
#include <QMouseEvent>

# define tc(a) QString::fromLocal8Bit(a)

class MyCustomWidget:public QWidget
{
	Q_OBJECT
public:
	explicit MyCustomWidget(QWidget* parent = nullptr);

protected:
	void keyPressEvent(QKeyEvent* event) override;
	void keyReleaseEvent(QKeyEvent* event) override;
	void mouseDoubleClickEvent(QMouseEvent* event) override;
	void mouseMoveEvent(QMouseEvent* event) override;
	void mousePressEvent(QMouseEvent* event) override;
	void mouseReleaseEvent(QMouseEvent* event) override;
};

#include "MyCustomWidget.h"
#include <QMessageBox>


MyCustomWidget::MyCustomWidget(QWidget *parent) : QWidget(parent) {
	setFocusPolicy(Qt::StrongFocus);
}

void MyCustomWidget::keyPressEvent(QKeyEvent * event)
{
	if (event->key() == Qt::Key_Enter) {
		QMessageBox::information(this, tc("键盘事件"), tc("按下进入"));
	}
	else {
		QWidget::keyPressEvent(event); // 调用基类的事件处理,确保其他键的默认行为
	}
}

void MyCustomWidget::keyReleaseEvent(QKeyEvent * event)
{
	QMessageBox::information(this, tc("键盘事件"), tc("释放按键"));
}

void MyCustomWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
	QMessageBox::information(this, tc("鼠标事件"), tc("双击事件"));
}

void MyCustomWidget::mouseMoveEvent(QMouseEvent * event)
{
	QWidget::mouseMoveEvent(event); // 通常不需要中断默认处理
}

void MyCustomWidget::mousePressEvent(QMouseEvent * event)
{
	if (event->button() == Qt::LeftButton) {
		QMessageBox::information(this, tc("鼠标事件"), tc("鼠标左键按下"));
	}
	else {
		QWidget::mousePressEvent(event);
	}
}

void MyCustomWidget::mouseReleaseEvent(QMouseEvent * event)
{
	QMessageBox::information(this, tc("鼠标事件"), tc("鼠标释放"));
}
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "MyTableModel.hpp"
#include <QSortFilterProxyModel>
#include "MyCustomWidget.h"

class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication1(QWidget *parent = nullptr);
    ~QtWidgetsApplication1();

	MyTableModel myModel;
	QSortFilterProxyModel proxyModel;

protected:
	bool eventFilter(QObject* watched, QEvent* event) override;

private:
    Ui::QtWidgetsApplication1Class ui;
	MyCustomWidget *mywidget;
};
#include "QtWidgetsApplication1.h"
#include <QMessageBox>

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	//设置源模型
	proxyModel.setSourceModel(&myModel);
	//为UI设置模型
	ui.tableView->setModel(&proxyModel);
	//启用排序
	ui.tableView->setSortingEnabled(true);

	mywidget = new MyCustomWidget(this);
	mywidget->installEventFilter(this);
	setCentralWidget(mywidget);//设置mymywidget为当前窗口
}

QtWidgetsApplication1::~QtWidgetsApplication1()
{}

bool QtWidgetsApplication1::eventFilter(QObject * watched, QEvent * event)
{
	if (watched == mywidget && event->type() == QEvent::KeyPress)
	{
		QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
		if (keyEvent->key() == Qt::Key_Enter)
		{
			QMessageBox::information(this, tc("事件过滤器"), tc("enter键被过滤器拦截"));
			return true; // 阻止事件进一步传递
		}
	}
	return QMainWindow::eventFilter(watched, event);// 确保其他事件正常传递
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值