Qt事件
来源:互联网 发布:淘宝开女装店去哪进货 编辑:程序博客网 时间:2024/05/17 00:51
其实本文大部分取自于豆子的《Qt学习之路》(19),我也加上自己的一点理解。
事件测试程序:
#include <QApplication>#include <QWidget>#include <QLabel>#include <QMouseEvent>class EventLabel : public QLabel{protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event);};void EventLabel::mouseMoveEvent(QMouseEvent *event){ this->setText(QString("<center><h1>Move: (%1, %2)</h1></center>") .arg(QString::number(event->x()), QString::number(event->y())));}void EventLabel::mousePressEvent(QMouseEvent *event){ this->setText(QString("<center><h1>Press: (%1, %2)</h1></center>") .arg(QString::number(event->x()), QString::number(event->y())));}void EventLabel::mouseReleaseEvent(QMouseEvent *event){ QString msg; msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>", event->x(), event->y()); this->setText(msg);}int main(int argc, char *argv[]){ QApplication app(argc, argv); EventLabel *label = new EventLabel; label->setWindowTitle("MouseEvent Demo"); label->resize(300, 200); label->show(); return app.exec();}
这个程序如何运行:
qmake -project
qmake **.pro
make
会生成一个可执行文件。
运行:
./**
备注:
这里继承了QLabel类,重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三个函数。我们并没有添加什么功能,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面。
Qt的事件很容易和信号槽混淆。这里简单的说明一下,signal由具体对象发出,然后会马上交给由connect函数连接的slot进行处理;而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。总的来说,如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件。
下面是事件的处理:
void MyLabel::mousePressEvent(QMouseEvent * event){ if(event->button() == Qt::LeftButton) { // do something } else { QLabel::mousePressEvent(event); }}
如果按下的是左键,做我们的处理工作,如果不是左键,则调用父类的函数。这在某种程度上说,是把事件向上传递给父类去响应,也就是说,我们在子类中“忽略”了这个事件。
Qt的事件对象都有一个accept()函数和ignore()函数。正如它们的名字,前者用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;后者则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递,寻找另外的接受者。
- Qt事件
- QT事件
- QT事件
- QT事件
- QT事件
- QT事件
- QT事件
- qt事件
- Qt事件
- Qt事件
- QT事件
- Qt事件
- QT事件
- QT 事件
- Qt 事件与事件过滤
- Qt 事件与事件过滤
- Qt 事件与事件过滤
- Qt事件处理-事件过滤器
- Ogre 1.7 SDKTRAY 初探
- 09-防止用户未登录非法访问某个页面的方法
- infopath表单预览正常,发布后无法通过Web Service获取当前用户信息的解决方案
- Cocos2d-x--VS2012,Cocos2d-x v3.0.0与vld检测内存泄漏
- javaBean
- Qt事件
- volatile详解
- chap8_2 Fresnel in OGRE
- rails
- 找出字符串中,指定的相同子串的数量
- android.view.ViewRootImpl$CalledFromWrongThreadException: UI线程和子线程(工作线程)冲突
- 给Ubuntu 13.04换源 软件源、更新源
- 有源晶振 串电阻
- Codeforces Round #196 (Div. 2)