Qt学习之路(19):事件(event)[VC/C++编程]
本文“Qt学习之路(19):事件(event)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
前面说了几个尺度对话框,下面不打算持续阐明一些组件的利用,因为这些利用很难讲完,很多东西都是与实际利用相关的.实际利用的复杂性决意了我们根本不大概把全部组件的全部利用办法都说懂得.这次来说说Qt相对高级一点的特点:事件.
事件(event)是有系统大概Qt本身在差别的时刻发出的.当用户按下鼠标,敲下键盘,大概是窗口需求重新绘制的时刻,城市发出一个呼应的事件.一些事件是在对用户操作做出呼应的时刻发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件.
普通来说,利用Qt编程时,我们并不会把主要精神放在事件上,因为在Qt中,需求我们关心的事件总会发出一个信号.比方,我们关心的是 QPushButton的鼠标点击,但我们不需求关心这个鼠标点击事件,而是关心它的clicked()信号.这与其他的一些框架差别:在Swing中,你所要关心的是JButton的ActionListener这个点击事件.
Qt的事件很简单和信号槽混合.这里简单的阐明一下,signal由具体对象发出,然后会即刻交给由connect函数衔接的slot举行处理;而关于事件,Qt利用一个事件行列对全部发出的事件举行保护,当新的事件产生时,会被追加到事件行列的尾部,前一个事件完成后,取出背面的事件举行处理.但是,必要的时刻,Qt的事件也是可以不进入事件行列,而是直接处理的.并且,事件还可以利用“事件过滤器”举行过滤.总的来说,假如我们利用组件,我们关心的是信号槽;假如我们自定义组件,我们关心的是事件.因为我们可以通过事件来改变组件的默许操作.比方,假如我们要自定义一个QPushButton,那么我们就需求重写它的鼠标点击事件和键盘处理事件,并且在得当的时刻发出clicked()信号.
还记得我们在main函数里面成立了一个QApplication对象,然后调用了它的exec()函数吗?其实,这个函数就是开始Qt的事件循环.在履行exec()函数之后,程序将进入事件循环来监听利用程序的事件.当事件发生时,Qt将成立一个事件对象.Qt的全部事件都担当于 QEvent类.在事件对象成立完毕后,Qt将这个事件对象传送给QObject的event()函数.event()函数并不直接处理事件,而是按照事件对象的范例分配给特定的事件处理函数(event handler).关于这一点,我们会在今后的章节中具体阐明.
在全部组件的父类QWidget中,定义了很多事件处理函数,如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等.这些函数都是protected virtual的,也就是说,我们应当在子类中重定义这些函数.下面来看一个例子.
#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();
}
这里我们担当了QLabel类,重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三个函数.我们并没有增添什么功效,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面.注意我们在mouseReleaseEvent函数里面有关QString的构造.我们没有利用arg参数的方法,而是利用C语言气势的sprintf来构造QString对象,假如你对C语法很熟习(预计很多C+++程序员城市对比熟习的吧),那么便可以在Qt中试试熟习的C格局化写法啦!
出处:http://devbean.blog.51cto.com/448512/223974
以上是“Qt学习之路(19):事件(event)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |