西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → 什么是信号槽?深入理解信号槽

什么是信号槽?深入理解信号槽

相关软件相关文章发表评论 来源:豆子空间时间:2010/11/19 11:47:50字体大小:A-A+

作者:FinderCheng点击:480次评论:0次标签: 信号槽 Qt信号 Boost

  • 类型:游戏其他大小:6.6M语言:多国语言[中文] 评分:3.7
  • 标签:
立即下载
2 页 使用信号槽

使用信号槽

信号槽是伟大的工具,但是如何能更好的使用它们?相比于直接函数调用,有三点值得我们的注意。一个信号槽的调用:

或许会比直接函数调用耗费更多的时间/空间;
可能不能使用 inline;
对于代码阅读者来说可能并不友好。
使用信号槽进行解耦,我们获得的最大的好处是,连接两端的对象不需要知道对方的任何信息。Button 同动作的连接是一个很典型的案例。例如如下信息:

class Elevator
{
public:
enum Direction { DownDirection=-1, NoDirection=0, UpDirection=1 };
enum State { IdleState, LoadingState, MovingState };
// ...
// signals:
void floorChanged( int newFloor );
void stateChanged( State newState );
void directionChanged( Direction newDirection );
};Elevator 类,也就是电梯,不需要知道有多少显示器正在监听它的信号,也不需要知道这些显示器的任何信息。每一层可能有一个屏幕和一组灯,用于显示电梯的当前位置和方向,另外一些远程操控的面板也会显示出同样的信息。电梯并不关心这些东西。当它穿过(或者停在)某一层的时候,它会发出一个 floorChanged(int) 信号。或许,交通信号灯是更合适的一个例子。

你也可以实现一个应用程序,其中每一个函数调用都是通过信号来触发的。这在技术上说是完全没有问题的,然而却是不大可行的,因为信号槽的使用无疑会丧失一部分代码可读性和系统性能。如何在这其中做出平衡,也是你需要考虑的很重要的一点。

Qt 方式

了解 Qt 信号槽最好的莫过于 Qt 的文档。不过,这里我们从一个小例子来了解信号槽的 Qt 方式的使用。

// Qt Signals and Slots

class Button : public QObject
{
Q_OBJECT
Q_SIGNALS:
void clicked();
};

class Page : public QObject
{
Q_OBJECT
public Q_SLOTS:
void reload();
};

// given pointers to an actual Button and Page:
connect(button, SIGNAL(clicked()), page, SLOT(reload()));Boost.Signals 方式

了解 Boost.Signals 的最好方式同样是 Boost 的文档。这里,我们还是先从代码的角度了解一下它的使用。

// Boost.Signals

class Button
{
public:
boost::signal< void() > clicked;
};

class Page
{
public:
void reload();
};

// given pointers to an actual Button and Page:
button->clicked.connect( boost::bind(&Page::reload, page) );对比

或许你已经注意到上面的例子中,无论是 Qt 的实现方式还是 Boost 的实现方式,除了必须的 Button 和 Page 两个类之外,都不需要额外的类。两种实现都解决了类爆炸的问题。下面让我们对照着来看一下我们前面的分析。现在我们有:

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)