Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268213
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类: C/C++

2011-10-17 15:10:51

QT的信号槽机制是可以媲美MFC的消息机制的关键技术,但是效率有所降低,不过几乎可以忽略。这两天在VS2010下集成了QT,进行了简单的测试开发,介绍一下信号槽机制。

信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

在我们所熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dumps。

所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信 号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

首先利用VS2010下QT的插件创建一个qttest项目,这样项目中就存在了基本的ui文件(通过QTDesigner可视化修改),以及入口main.cpp和qttest类文件,通过QTDesigner在ui上面添加一个Button,保存,修改qttest.cpp文件,在构造函数里面添加信号槽,代码如下:

  1. //buttonname为QTDesigner里面的button的名字
  2. connect(ui.buttonname,SIGNAL(clicked()),this,SLOT(close()));
这样就相当于将Button的clicked()信号绑定到了槽close()上,当单击发生时,close被调用,程序关闭。
此处调用的是系统函数,那么如何自定义呢?
在qttest类里面添加函数test(),必须声明为public slots:,也就是槽函数,在类文件实现函数添加
  1. QMessageBox::about(this,"Slot test","It's right");
并将close()修改为test()函数,编译运行得到结果。
如果要创建一个信号则生命如下函数:
  1. signals:
  2.     void signalstest();
注意此函数就用到了开始提到的moc工具,其实现实自动实现的,一定不能在自己的类里面实现,当任何地方调用该函数的时候就行当与发出了一个信号,只需要用类似于
  1. connect(this,SIGNAL(signalstest()),this,SLOT(signalRecv()));
这样的绑定即可!编译运行,成功!

阅读(6230) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~