Qt事件过滤器如何使用

前言,自定义一个窗口类,包含一个QLineEdit以及一个QLabel。将这个窗口添加到QTableWidget的单元格中。单击单元格的QLineEdit时弹出所我需要的窗口,而不是进行默认的操作。这个如何实现?如何添加自定义窗口到表格中?Qt的事件过滤器如何使用?

目录

 

1.自定义窗口类

2.将此窗口类添加到表格中

3.使用事件过滤器

3.1现象

3.2概念

3.3具体使用步骤

3.3.1对所需要检测的控件安装事件过滤器、

3.3.2重写eventFilter函数

4.完整代码


1.自定义窗口类

一个简单的窗口类,qt的uidesigner中随便画一个,整体代码放在最后

2.将此窗口类添加到表格中

效果如图:

代码如下,paramWidget是我自定义的窗口类。创建伊恩对象,使用setCellWidget设置上去、

3.使用事件过滤器

3.1现象

当点击窗口中的QLineEdit时,弹出另外一个窗口,而不是进行默认的操作。

正常情况下,当点击QLineEdit的时候会出现一个光标。

现在需要在点击的label文字是BCMU DO输出这一特定的QLineEdit的时候弹出此窗口

这个时候需要使用到事件过滤器。

3.2概念

在介绍事件过滤器之前先说一个概念,事件分发,每个继承于QObject的类,都有一个事件分发函数(event),event函数是整个Qt事件处理系统的核心,它负责分发事件给对象及其父类,直到某个对象处理了该事件,或该事件被完全忽略。

举例子就是,当你按下鼠标左键时,先调用event函数,在此函数 中判断这个事件是什么类型,该事件是mouseButtonPress类型,要调用默认的mousePressEvent事件函数处理。

这也就是为什么你点击鼠标左键时,为什么会有默认光标的在那里的原因

那么什么是事件过滤器呢?

首先要知道事件过滤器是发生在事件分发之前的,在事件被分发之前,对此事件进行处理。这个时候看一下官网概念,事件过滤器(Event Filter)是 Qt 框架提供的一种机制,用于监视并可能拦截或修改某些对象上的事件处理。在 QT 中,事件过滤器主要用于扩展或修改行为,而不需要重写整个类或派生子类。换句话说就是对所需要检测的对象可能发生的事件进行过滤处理。在本案例中就是对QLineEdit的点击事件进行过滤。

3.3具体使用步骤

3.3.1对所需要检测的控件安装事件过滤器、

3.3.2重写eventFilter函数


.h文件中

.cpp中

4.完整代码

paramWidget.h

#pragma once

#include <QMainWindow>
#include "ui_paramWidget.h"
#include <QEvent>
#include <QMouseEvent>
#include "BcmuDo.h"

class paramWidget : public QMainWindow
{
	Q_OBJECT

public:
	paramWidget(QWidget *parent = nullptr);
	~paramWidget();
	void setLabelText(QString Param);
	void setLineEditText(QString Param);
	QString getLineEditText();
	QLineEdit* getLineEditObj();
protected:
	bool eventFilter(QObject* watched, QEvent* event) override;
private slots:
	void showPopUpWindow();
private:
	Ui::paramWidgetClass ui;
};

paramWidget.cpp

#include "paramWidget.h"

paramWidget::paramWidget(QWidget *parent)
	: QMainWindow(parent)
{
	
	ui.setupUi(this);
	QFrame* line = new QFrame(this);
	line->setFrameShape(QFrame::HLine);
	line->setFrameShadow(QFrame::Sunken);
	ui.verticalLayout->insertWidget(2, line);
	
	ui.lineEdit->installEventFilter(this);
}

bool paramWidget::eventFilter(QObject* watched, QEvent* event)
{
	if (watched == ui.lineEdit && event->type() == QEvent::MouseButtonPress) {
		QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
		if (mouseEvent->button( ) == Qt::LeftButton) {
			showPopUpWindow();
			//return true的意思是处理完自己的逻辑之后,不需要在传递事件
			return true;
		}
	}

	return QMainWindow::eventFilter(watched, event);
	
}



void  paramWidget::showPopUpWindow()
{
	qDebug() << ui.label->text();
	if (ui.label->text() == "BCMU DO输出"){
		BcmuDo* bcmuDo = new BcmuDo(this);
		bcmuDo->show();
	}
	
}
void paramWidget::setLabelText(QString Param)
{

	ui.label->setText(Param);
	ui.label->setWordWrap(true);
	
}

void paramWidget::setLineEditText(QString Param)
{
	ui.lineEdit->setText(Param);
}
QString paramWidget::getLineEditText()
{
	return ui.lineEdit->text();
}
QLineEdit* paramWidget::getLineEditObj()
{
	return ui.lineEdit;
}
paramWidget::~paramWidget()
{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值