前言、因实践课程讲解需求,简单介绍下qt的信号与槽。
一、了解信号与槽
怎样使用信号与槽? 概览 还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多的问题。Qt提供了一种新的事件处理系统-信号-槽。想象一下闹钟(工作的样子)。当闹铃响的时候,它正在发出信号(发射)。而你处理这个事件的过程就类似使用一个槽的样子。
void mySlot(int i = 0); 信号与槽的连接 可以使用下面的模板(原型)连接信号和槽: QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method); 必须把上式中的const char * signal和const char * method分别放进SIGNAL() 和SLOT() 这两个宏里面。 可以像下面那样解除信号和槽的连接: QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method); 进一步探讨 当事件发生时,某个部件(或对象)就会发射信号。比如,当一个按钮部件被点击时,它就会发出"被点击"这个信号。开发者可以选择创建一个函数(没错,它就是一个"槽"),并使用 connect() 来把这个信号与槽关联起来。Qt的信号与槽机制(被设计成)并不要求这些相关的类互相了解,这就使得开发高度可重用的类变得更容易。由于信号与槽是类型安全的,类型错误会以警告的方式(被编译器)报告出来并且不会引起(程序)崩溃。 举例来说,假如一个Quit按钮的 clicked() 信号与应用程序的 quit() 槽相连接,那么当用户点击该Quit按钮时,就会终止这个程序的运行。用代码实现该连接如下: connect(button, SIGNAL (clicked()), qApp, SLOT (quit())); 在应用程序运行期间的任何时候,信号与槽的连接都可以被添加或移除。它们可以在信号被立即或者安排到以后去发射时建立起来,而且可以用于不同对象间的多线程应用中。 信号与槽机制是使用标准C+实现的。它使用了C中的预处理器以及Qt中的 moc, 即元对象编译器( Meta-Object Compiler)。代码的生成由Qt的构建系统(Qt's-Build-System)自动完成。开发者几乎不需要浏览或者编辑这些代码。 除了完成信号与槽的处理,元对象编译器还对Qt的多语言机制、属性系统以及扩展的运行时类型识别提供了支持。它还为C+程序的运行时内省在所有支持的平台上的运行提供了一种途径。 |
二、实例讲解
三、实例代码:
.pro文件
main.cpp
运行界面效果: | ||
<<main.cpp>> <<2_14.pro.user>> |