installeventfilter

问题描述:qt的installeventfilter怎么用 这篇文章主要介绍了一个有趣的事情,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。

qt4 tableWidget 怎么给每个单元格加上时间过滤器installEventFilter?分数没用我送几个Q币好了

installeventfilter的相关图片

1. 在Cpp中对某一个对象 obj->installeventfilter(this), 即是对此对象安装了本对象(*this)的事件过滤器。

2. 在(*this)的Cpp中重载bool QObject::eventFilter(QObject * watched, QEvent * event)。

3. 再判断watched == obj, 然后获取event->type()的值是否需要事件.。

求助Qt事件过滤器eventFilter问题的相关图片

求助Qt事件过滤器eventFilter问题

Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。

假设我们有一个CustomerInfoDialog控件,由一些QLineEdit控件组成。我们希望使用Space键得到下一个QLineEdit的输入焦点。一个最直接的方法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调用focusNextChild():

void MyLineEdit::keyPressEvent(QKeyEvent *event)。

if (event->key() == Qt::Key_Space) {。

focusNextChild();。

} else {

QLineEdit::keyPressEvent(event);。

}

这个方法有一个最大的缺点:如果我们在窗体中使用了很多不同类型的控件(QComboBox,QSpinBox等等),我们也要继承这些控件,重写它们的keyPressEvent()。一个更好的解决方法是让CustomerInfoDialog监视其子控件的键盘事件,在监视代码处实现以上功能。这就是事件过滤的方法。实现一个事件过滤包括两个步骤:

1. 在目标对象上调用installEventFilter(),注册监视对象。

2. 在监视对象的eventFilter()函数中处理目标对象的事件。

注册监视对象的位置是在CustomerInfoDialog的构造函数中:

CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)。

: QDialog(parent)。

...

firstNameEdit->installEventFilter(this);。

lastNameEdit->installEventFilter(this);。

cityEdit->installEventFilter(this);。

phoneNumberEdit->installEventFilter(this);。

事件过滤器注册后,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit控件的事件首先到达CustomerInfoDialog::eventFilter()函数,然后在到达最终的目的地。

下面是eventFilter()函数的代码:

bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)。

if (target == firstNameEdit || target == lastNameEdit。

|| target == cityEdit || target == phoneNumberEdit) {。

if (event->type() == QEvent::KeyPress) {。

QKeyEvent *keyEvent = static_cast(event);。

if (keyEvent->key() == Qt::Key_Space) {。

focusNextChild();。

return true;。

}

}

}

return QDialog::eventFilter(target, event);。

首先,我们看是目标控件是否为QLineEdit,如果事件为键盘事件,把QEvent转换为QKeyEvent,确定被敲击的键。如果为Space键,调用focusNextChild(),把焦点交给下一个控件,返回true通知Qt已经处理了这个事件,如果返回false,Qt将会把事件传递给目标控件,把一个空格字符插入到QLineEdit中。

如果目标控件不是QLineEdit,或者事件不是Space敲击事件,把控制权交给基类QDialog的eventFilter()。目标控件也可以是基类QDialog正在监视的控件。(在Qt4.1中,QDialog没有监视的控件,但是Qt的其他控件类,如QScrollArea,监视一些它们的子控件)

Qt的事件处理有5中级别:

1. 重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。

2. 重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。

3. 给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。

4. 给QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。

5. 继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。

许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。

图7.2显示了一个键盘事件在一个对话框中从子控件到父控件的传播过程。当用户敲击一个键盘,时间首先发送到有焦点的控件上(这个例子中是QCheckBox)。如果QCheckBox没有处理这个事件,Qt把事件发送到QGroupBox中,如果仍然没有处理,则最后发送到QDialog中。

如何隐藏QT窗口在任务栏的任务图标的相关图片

如何隐藏QT窗口在任务栏的任务图标

设置事件过滤器时用设置其viewport的事件过滤。

实例:

#include <QtGui>。

#include <QtDebug>。

QTextEdit* pEdit = new QTextEdit(this);。

pEdit->viewport()->installEventFilter(this);。

bool xxx::eventFilter(QObject* o, QEvent* e)。

    Q_UNUSED(o);。

    if(e->type() == QEvent::MouseButtonPress){。

        QMouseEvent* pMe = static_cast<QMouseEvent*>(e);。

        qDebug() << pMe->pos();。

    }

    return false;。

qt,中视频播放问题,下面是代码请详细解答的相关图片

qt,中视频播放问题,下面是代码请详细解答

现在用到的挺多的软件基本都需要实现到这些个的功能。

1.对于无边框透明的窗口,其实两个设置两句话就搞定了。

setAttribute(Qt::WA_TranslucentBackground);。

setWindowFlags(Qt::FramelessWindowHint);。

然后就是这样之后无法响应鼠标的拖动,所以你要重载时间处理函数来实现鼠标的按下然后拖动的时间,其实就是根据鼠标的移动事件,判断如果按键是按下的状态,那么久move整个控件这样子。当然你觉得如果好多个窗口都要实现这个功能或者说你觉的写在程序的窗口类里面去重载这些个函数不太好。那么你可以自己建一个QOBJECT,然后利用这个object来处理窗口的事件。例如你的win窗口,需要实现这个功能,那么你就调用。

win->installEventFilter(this);this指的是你自己新建的用来处理拖动的时间的qobject类,然后多个win你都可以注册到这个obj上,之后你注册过的窗口的事件都会经过这个obj,你就可以在这里:eventFilter(QObject* obj, QEvent* event) 拿到鼠标的移动的信息,还可以判断拿到的对象,然后去实现想要的功能。其实用到的就是installEventFilter这个函数的事件注册的效果而已,然后有一点比较重要的就是:installEventFilter注册过的窗口,事件触发时候的优先级是越后注册的优先级越高,所以在后来注册的类里如果你在eventFilter里做完处理return了一个true,那消息就不会继续走,后面(先前注册的类)就拿不到这个消息。这个是要注意一下的,根据需求也能调整一下注册的顺序。对应的卸载就是removeEventFilter函数。

2.然后说一下托盘的事情

托盘其实利用的是QSystemTrayIcon这个类来实现。

qt中函数paintEvent(QPaintEvent*)是不是被系统自动调用的

mplayer = new MPlayer;//新建一个播放器的对象。

    playerLayout->addWidget(mplayer, 1);//将新建的添加到布局里面。

    mplayer->installEventFilter(this);//安装事件过滤器。

    mplayer->setMouseTracking(true);//鼠标跟随。

    mplayer->getLayer()->installEventFilter(this);/安装事件过滤器。

    mplayer->getLayer()->setMouseTracking(true);//鼠标跟随。

process = new QProcess(this);//启动一个新的进程,一般用来启动外部程序。

    process->setProcessChannelMode(QProcess::MergedChannels);//设置通道模式。

    connect(process, SIGNAL(finished(int)), this, SLOT(onFinished(int)));//进程结束时。

    connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));//进程标准输出。

    connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));//用于更新时间。

原文地址:http://www.qianchusai.com/installeventfilter.html

Dignity-20

Dignity-20

outer2-40

outer2-40

四年级观察火龙果日记怎么写,四年级观察火龙果日记怎么写二百字

四年级观察火龙果日记怎么写,四年级观察火龙果日记怎么写二百字

500字小作文,十篇优秀作文500字有题目

500字小作文,十篇优秀作文500字有题目

让我们一起阅读吧英文翻译,让我们一起阅读吧英文翻译怎么写

让我们一起阅读吧英文翻译,让我们一起阅读吧英文翻译怎么写

keyboards,keyboardsplitter双人成行

keyboards,keyboardsplitter双人成行

r7000梅林连不上网,梅林为什么不支持r7000p

r7000梅林连不上网,梅林为什么不支持r7000p

s-2000-200

s-2000-200

青山绿水鸟语花香视频,青山绿水鸟语花香图片 大自然

青山绿水鸟语花香视频,青山绿水鸟语花香图片 大自然

60年小学语文算术课本,70年代的小学算术课本内容

60年小学语文算术课本,70年代的小学算术课本内容