谈谈QtWebkit 键盘鼠标事件过滤

本文介绍如何使用QT的事件过滤机制来拦截特定事件,如鼠标右键点击和ESC按键按下,并展示了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QT的QObject对象提供了一个方法:void installEventFilter ( QObject * filterObj );

这里的参数filterObj也是一个QObject,  这个对象具体实施过滤事件的,它要重载

QObject的虚函数: virtual bool eventFilter( QObject * watched, QEvent * event );

第一个参数就是需要过滤事件的对象, 第二个参数就是传入的事件。

可以用static_cast转换成QMouseEvent或QKeyEvent。

这个函数的返回值false代表不过滤,还会传给上层, true表示吃掉了,不返回给上层了。

 

下面的示例程序就是对鼠标右键和ESC键的过滤:

类定义:

class FooBrowser : public QWebView
{
	Q_OBJECT
public:
	FooBrowser(QWidget* parent = 0);
	
Q_SIGNALS:
protected:
	bool eventFilter(QObject *obj, QEvent *ev);
};


类实现:

FooBrowser::FooBrowser(QWidget* parent) : QWebView(parent)
{
	// For WebView
	installEventFilter(this);

	// For WebPage
	page()->installEventFilter(this);

	// For WebFrame 
	page()->mainFrame()->installEventFilter(this);
}

bool FooBrowser::eventFilter(QObject *obj, QEvent *ev)
{


	if (ev->type() == QEvent::MouseButtonPress ||
		ev->type() == QEvent::MouseButtonRelease ||
		ev->type() == QEvent::MouseButtonDblClick){
		QMouseEvent *mouseev = static_cast<QMouseEvent *>(ev);
		if (mouseev->button() == Qt::RightButton) {
			qDebug("Eat right button!");

			return true;
		}
	}

	if (ev->type() == QEvent::KeyPress ||
		ev->type() == QEvent::KeyRelease) {
		QKeyEvent *keyev = static_cast<QKeyEvent *>(ev);
		qDebug("Eat key  %d", keyev->key());
		if (keyev->key() == Qt::Key_Escape) {
			reload();
		}
		return true;
	}
	return false;
}


//  测试主程序

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	
	FooBrowser *b = new FooBrowser;
	b->setWindowFlags(Qt::FramelessWindowHint);
	
	b->setGeometry(0,0,1280,720);
         b->load(QUrl("http://www.google.com"));
	b->show();

	return a.exec();
}


 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值