Qt进修之路(19):事件(event)
当前位置:以往代写 > C/C++ 教程 >Qt进修之路(19):事件(event)
2019-06-13

Qt进修之路(19):事件(event)

Qt进修之路(19):事件(event)

前面说了几个尺度对话框,下面不规划继承说明一些组件的利用,因为这些利用很难讲完,许多对象都是与实际应用相关的。实际应用的巨大性抉择了我们基础不行能把所有组件的所有利用要领都说大白。这次来说说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

    关键字:

在线提交作业