概述
总结一下今天工作中学到的要点:今天在工作中,主要遇到了一个事件相关的问题,就是我在编写一个Qt控件的时候,想要为这个控件增加一个事件处理!这里用到了Qt的事件处理模块。一般常用的按钮QPushButton控件本身就有单击事件,因此只要单击就会触发clicked信号,但是如果我想要给QLabel这种控件增加一个单击事件怎么办呢,这时就可以继承一下QLabel,然后为其内部实现mousePressEvent即可:
class new_qlabel : public QLabel
{
Q_OBJECT
public:
explicit new_qlabel(QWidget *parent = 0):QLabel(parent){}
protected:
void mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::MidButton)
{
qDebug()<<"点击了鼠标中键";
emit on_midbutton_clicked();
}
QLabel::mousePressEvent(e);
}
signals:
on_midbutton_clicked();
};
为了简单,我实现文件和头文件写在了一起,实际编程时记着分开,这里要注意两点,一个是记着加Q_OBJECT
宏,一个是处理完事件后运行父类的对应函数QLabel::mousePressEvent(e);
从而将事件传递给父类,因为有些事件可能父类还要处理。
最后总结一下Qt事件处理提供的5个级别的事件处理和过滤:
1. 重新实现事件函数。 比如: mousePressEvent(), keyPress-Event(), paintEvent() 。 这是最常规的事件处理方法。
2. 重新实现QObject::event(). 这一般用在Qt没有提供该事件的处理函数时。也就是,我们增加新的事件时。这种方式常用于覆盖Tab键的默认意义。这种方式也可以用于处理那些没有特定事件处理器的不常见类型的事件中(如:QEvent::HoverEnter)。注意:重实现这个虚函数时记着结尾调用基类的event()函数,防止没有处理的事件止于此函数。
3. 安装事件过滤器:对象使用installEventFilter()注册后,用于目标对象的所有事件都会首先发送给这个监视对象的eventFilter()函数。如果同一对象上安装多个事件处理器,那么按照安装顺序的逆序,即最近安装的到最先安装的,依次激活这些事件处理器。
4. 在 QApplication 上安装事件过滤器。 这之所以被单独列出来是因为: QApplication 上的事件过滤器将捕获应用程序的所有事件,而且第一个获得该事件。也就是说事件在发送给其它任何一个eventFilter()函数之前发送给QApplication的eventFilter()函数。这种处理方式对于调试非常有用,也可用来处理那些发送给失效窗口部件的鼠标事件,因为QApplication通常会忽略这些事件。
5. 重新实现QApplication 的 notify()方法. Qt使用 notify()来分发事件。要想在任何事件处理器捕获事件之前捕获事件,唯一的方法就是重新实现QApplication 的 notify()方法。
最后
以上就是危机小笼包为你收集整理的Qt事件处理的使用方法的全部内容,希望文章能够帮你解决Qt事件处理的使用方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复