前言:
由于老师的强制任务,必需把自己的学习收获以博客的形式永久保存。所以我一个初学者不得不在这里把自己浅薄的知识拿出来请大家斧正(也就是下面是我的个人理解,可能不是正确的,但也算是我个人的体会)。希望能对正在学习Qt Creator的同学有所帮组。
目的:
帮助大家更好的理解Qt Creator的C++语言中的信号/槽方式,与java 中常用的callback机制比较,方便想我这样同时学习两者的新手更好的进行windows设计,少走弯路。
Qt Creator:
QT语言以信号/槽方式取代callback机制,为编程提供了灵活性,而备受赞誉。
用户在界面进行指定操作就会产生信号,然后由事先写好的connect函数将信号与槽(信号与槽实质上都是一种特殊的函数,可以看作信号函数调用了指定的槽函数)关联起来,从而完成槽函数的调用,即所需功能的完成。
以下是具体的优点:https://blog.youkuaiyun.com/kilotwo/article/details/79231759,总的来说,信号/槽是将java中的事件与监听器分开,达到更为自由的连接。别人说的比我更具体:
- 信号槽是观察者模式的一种实现,或者说是一种升华;
- 一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知;
- 一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候——也可以说是信号发出的时候——被调用的函数;
- 你可以将信号和槽连接起来,形成一种观察者-被观察者的关系;
- 当事件或者状态发生改变的时候,信号就会被发出;同时,信号发出者有义务调用所有注册的对这个事件(信号)感兴趣的函数(槽)。
java:
java处理事件是事件与监听器完成的,首先是用户在界面进行操作,从而使事件源产生事件,当一个事件发生时,该事件用一个事件对象来表示。事件对象有对应的事件类。不同的事件类描述不同类型的用户动作。事件类包含在java.awt.event和javax.swing.event包中。然后java虚拟机就会对系统自动产生的事件调用事件监听器。
java处理事件的优点有
以下为别人写的测试代码:
- package test1;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.border.EmptyBorder;
- public class SimpleActionEvent extends JFrame {
- private JPanel _contentPane;
- private JButton _jb; // 动作事件
- private JTextField _jt;// 焦点事件
- /**
- * Launch the application.
- */
- public static void main(String[] args) {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- try {
- SimpleActionEvent frame = new SimpleActionEvent();
- frame.setVisible(true);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
- /**
- * Create the frame.
- */
- public SimpleActionEvent() {
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setBounds(100, 100, 450, 300);
- _contentPane = new JPanel();
- _jb = new JButton("我是按钮,单击我");
- _jt = new JTextField("请单击其他地方", 10);
- _contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
- _contentPane.setLayout(new FlowLayout());
- // 动作事件
- _jb.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO 自动生成的方法存根
- _jb.setText("我被单击了");
- }
- });
- // 焦点事件
- _jt.addFocusListener(new FocusListener() {
- @Override
- public void focusLost(FocusEvent e) {
- // TODO 自动生成的方法存根
- JOptionPane.showMessageDialog(null, "失去焦点");
- }
- @Override
- public void focusGained(FocusEvent e) {
- // TODO 自动生成的方法存根
- }
- });
- _contentPane.add(_jb);
- _contentPane.add(_jt);
- setContentPane(_contentPane);
- }
- }