3. 软件实现
由于计算器的工作状态是,一直在等待外界的操作,类似于一直在执行循环跳转指令等
待系统中断。因此,中断的设计对于计算器软件的设计就显得至关重要,在介绍计算器具体
功能之前先引入信号和槽两个重要的概念。
3.1 信号和槽
信号和槽作为 QT 的核心机制在 QT 编程中有着广泛的应用, 信号和槽机制是 QT 的
核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于
对象之间的通信,他是 QT 的核心特性,也是 QT 差别于其他工具包的重要地方。信号和槽
是 QT 自行定义的一种通信机制,他独立于标准的 C/C++语言,因此要正确的处理信号和槽,
必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是个 C++预处理程式,
为高层次的事件处理自动生成所需要的附加代码。
在我们所熟知的非常多 GUI 工具包中,窗口小部件(widget)都有一个回调函数用于响应
他们能触发的每个动作,这个回调函数通常是个指向某个函数的指针。不过,在 QT 中信
号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程式更为简洁明了。信号和槽能
携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core
dumps。
所有从 QObject 或其子类(例如 Qwidget)派生的类都能够包含信号和槽。当对象改动其
状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,他不知道另一端
是谁在接收这个信号。这就是真正的信息封装,他确保对象被当作一个真正的软件组件来使
用。槽用于接收信号,但他们是普通的对象成员函数。一个槽并不知道是否有所有信号和自
己相连接。而且,对象并不了解具体的通信机制。
你能将非常多信号和单个的槽进行连接,也能将单个的信号和非常多的槽进行连接,甚至于
将一个信号和另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将
即时发射第二个信号。总之,信号和槽构造了一个强大的部件编程机制。
3.1.1 信号
当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定
义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,和其相关联的槽将
被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有 GUI 事件循环。
只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那
么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机
的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。
信号的声明是在头文件中进行的,QT 的 signals 关键字指出进入了信号声明区,随后即可声
明自己的信号。例如,下面定义了三个信号:
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
在上面的定义中,signals 是 QT 的关键字,而非 C/C++的。接下来的一行 void mySignal()