SIGNAL-SLOT是Qt的一大特色,使用起来十分方便。在传统的AWT和Swing编程中,我们都是为要在
监听的对象上添加Listener监听器。被监听对象中保存有Listener的列表,当相关事件发生时,被监听
对象会通知所有Listener。而在Qt中,我们只需通过connect方法连接两个对象上的方法就可以了,非常
方便、优雅地实现了传统的观察者Observer模式。
Qt是如何办到的呢?对于发出SIGNAL的对象,我们需要在其头文件定义中声明Q_Object宏,之后Qt的
预处理器MOC会为我们自动添加上相应的代码来实现SIGNAL-SLOT机制。这与AspectJ自定义了Javac
编译器很类似,都是通过增强编译器来自动添加相应的代码。
增强编译或增加预处理太复杂,怎样能够简单的实现这种机制呢?首先我们实现一个类似的QObject类,
需要发射SIGNAL的类都要继承它。在QObject类中,我们自动为其子类提供监听器列表,查找SLOT方法,
信号发射等功能。
QObject.java
1.在连接方法中,我们将信号和新建的ReceiverSlot类保存到Map中,从而将它们关联起来。
2.在创建ReceiverSlot时,我们解析SLOT方法名,如将slot(String,String)解析为方法slot,参数两个String。
如果解析失败我们就认为该SLOT仍是一个信号,也就是SIGNAL-SIGNAL的连接。这种情况下,我们需要
传递调用的不是receiver的SLOT方法,而是emit方法继续发射信号。
3.解析后,如果是SIGNAL-SLOT的连接,那我我们根据方法名和参数找到该方法,准备反射调用。
4.发射信号时,我们取到所有与该SIGNAL关联的ReceiverSlot类,逐个发射信号。
之后,我们实现一个它的子类QWidget,将常用的Swing控件都封装在QWidget的子类中,为这些控件提供
常见的预定义的SIGNAL,像Qt中的clicked和returnPressed。
QWidget.java
以下是封装了JButton和JTextField的QWidget子类。
QPushButton.java
QLineEdit.java
下面我们来写个测试类实验下Java版的SIGNAL-SLOT机制,依旧是之前的浏览器的例子。
AddressBar.java
TabBar.java
MainWindow.java
测试一下吧,运行起来的效果就是这样。
新建Tab页和前往该地址事件都可以成功地从AddressBar传递到TabBar。怎么样,这种Java版的
SIGNAL-SLOT是不是很方便。多开拓自己的视野,借鉴优秀的思想,我们才能做出更好的设计!
希望你喜欢本文。
分享到:
相关推荐
signal-slot机制是QT的核心,也是QT解决线程之间通信的一大亮点。深刻理解其两大特性: (1)loosely coupled sender 与 receiver 互不关心,一个signal可以被多个slot获取,signal可以触发另一个signal (2)type-...
【QT】父组件与子组件的相互通信例子(用signal-slot实现) 目标: 新建一个QMainWindow窗口,在该窗口中添加一个打开按钮,一个spinBox,点击打开按钮后弹出一个对话框,对话框里面有一个slider。改变slider后...
qtjambi是Java版的qt, 适合java的GUI开发 这是4.5.2版的, 支持qt4.5, 配合eclipse插件可以使用qt designer!! 用法: 1. 将 qtjambi-eclipse 的plugin目录下的jar包拷贝到eclipse的plugin目录下 2. 将 qtjambi-...
Qt qt-opensource-windows-x86-5.11.0安装包,适用于开发openCV、QtAndroid
QT中的SIGNAL和SLOT 了解其中的原理让Qt编程更轻松
qtcharts-opensource-src-5.7.0
Qt中的signal和slot
eclipse集成qtjambi,利用qt进行界面gui开发的插件和jar包。包括qtjambi-eclipse-integration-4.5.2_01.zip 和 qtjambi-4.7.1.jar。
缺少libQt5WebKitWidgets.so的关键包 yum -y install teamviewer_14.2.2558.x86_64.rpm 报错
http://qt.nokia.com/products/qt-addons/solutions-archive/ 有JPEG2000的,有Windows中Services的,有浏览器插件的,有单应用程序的,有SOAP的,有文件加锁操作的,有属性操作的。 如果你比较节俭资源分,那么也...
QT是继JAVA之后又一可以运行在多平台上的开发工具(尤其是在Linux),诺基亚官方一直提供全套免费全功能下载,但是近来诺基亚关闭了免费渠道,只提供有限制的30天试用版(人心不古啊!)。这是在诺基亚收费前最后一...
在使用java 进行qt 界面开发的时候,必不可少的qt jambi 开发包。 下载压缩包后 将其中的 jar导入项目的build path。 然后,在安装了qtjambi 插件的eclipse 中的 Qt Jambi Preference Page 的 Jambi Location 处...
qt-vs-addin-1.2.5.part3
1、qt-everywhere-src-5.12.12的源代码 2、编者编译Qt5.12.12所使用的代码一并上传,方便大家下载编译.
qt-creator-2.8.0 for Linux源文件
使用eclipse进行java的qt gui 界面开发的必须插件。很难找到的资源。 解压后复制到eclipse/plugins文件中,然后重新启动eclipse就行了。
qt-opensource-windows-x86-msvc2015_64-5.8.0:vs2015版本的qt,解决官网下载不了的问题,已存在百度网盘
qt-vs-tools-msvc2013-2.1.1 安装以后就可以在Visual Studio中找到QT VS TOOLS了。 软件的具体功能问百度吧。
qt vs2015 插件(qt-vsaddin-msvc2015-2.4.2-rev.14.vsix)
qttelnet-2.1_1-opensource.zip