您的位置:首页 > 编程语言 > Qt开发

谈谈QtWebkit 键盘鼠标事件过滤

2011-12-15 18:35 399 查看
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: