- 1、本文档共66页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《Qt Creator快速入门》第2版 第7章 Qt对象模型与容器类 主 要 内 容 7.1 对象模型(第1课时) 7.2 容器类(第2课时) 7.3 正则表达式(第3课时) 7.4 小结(第3课时) 7.1 对象模型 标准C++对象模型可以在运行时非常有效的支持对象范式(object paradigm),但是它的静态特性在一些问题领域中不够灵活。图形用户界面编程不仅需要运行时的高效性,还需要高度的灵活性。为此,Qt在标准C++对象模型的基础上添加了一些特性,形成了自己的对象模型。这些特性有: 一个强大的无缝对象通信机制——信号和槽(signals and slots); 可查询和可设计的对象属性系统(object properties); 强大的事件和事件过滤器(events and event filters); 通过上下文进行国际化的字符串翻译机制(string translation for internationalization); 完善的定时器(timers)驱动,使得可以在一个事件驱动的GUI中处理多个任务; 分层结构的、可查询的对象树(object trees),它使用一种很自然的方式来组织对象拥有权(object ownership); 守卫指针即QPointer,它在引用对象被销毁时自动将其设置为0; 动态的对象转换机制(dynamic cast); Qt的这些特性都是在遵循标准C++规范内实现的,使用这些特性都必须要继承自QObject类。其中对象通信机制和动态属性系统,还需要元对象系统(Meta-Object System)的支持。 信号和槽 信号和槽用于两个对象之间的通信,信号和槽机制是Qt的核心特征,也是Qt不同于其他开发框架的最突出的特征。在GUI编程中,当改变了一个部件时,总希望其他部件也能了解到该变化。更一般来说,我们希望任何对象都可以和其他对象进行通信。例如,如果用户点击了关闭按钮,我们希望可以执行窗口的close()函数来关闭窗口。为了实现对象间的通信,一些工具包中使用了回调(callback)机制,而在Qt中,使用了信号和槽来进行对象间的通信。当一个特殊的事情发生时便可以发射一个信号,比如按钮被单击;而槽就是一个函数,它在信号发射后被调用,来响应这个信号。在Qt的部件类中已经定义了一些信号和槽,但是更多的做法是子类化这个部件,然后添加自己的信号和槽来实现想要的功能。 一个信号可以关联到多个槽上,多个信号也可以关联到同一个槽上,甚至,一个信号还可以关联到另一个信号上。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序是随机的,无法指定它们的执行顺序。 信号 声明一个信号,例如: signals: void dlgReturn(int); // 自定义的信号 声明一个信号要使用signals关键字。 在signals前面不能使用public、private和protected等限定符,因为只有定义该信号的类及其子类才可以发射该信号。 信号只用声明,不需要也不能对它进行定义实现。 信号没有返回值,只能是void类型的。 只有QObject类及其子类派生的类才能使用信号和槽机制,使用信号和槽,还必须在类声明的最开始处添加Q_OBJECT宏。 发射信号 例如: void MyDialog::on_pushButton_clicked() // 确定按钮 { int value = ui-spinBox-value(); // 获取输入的数值 emit dlgReturn(value); // 发射信号 close(); // 关闭对话框 } 当单击确定按钮时,便获取spinBox部件中的数值,然后使用自定义的信号将其作为参数发射出去。发射一个信号要使用emit关键字,例如程序中发射了dlgReturn()信号。 槽 自定义槽的声明: private slots: void showValue(int value); 实现: void Widget::showValue(int value) // 自定义槽 { ui-label-setText(tr(获取的值是:%1).arg(value)); } 声明一个槽需要使用slots关键字。一个槽可以是private、public或者protected类型的,槽也可以被声明为虚函数,这与普通的成员函数是一样的,也可以像调用一个普通函数一样来调用槽。
文档评论(0)