QT

简介

       QT是一个扩平台的C++应用程序开发框架,被广泛应用于开发GUI程序。QT是面向对象的,易于扩展,并且允许组件编程。QT是自由且开放源代码的软件,在GNU较宽松公共许可证条款下发布。
       使用Qt开发的软件,相同的代码可以在任何支持的平台上编译与运行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格
       Qt有相当多的模块,涉及文件读写、XML操作、JSON解析、正则表达式、智能指针、多线程、数据库、网络操作、图片动画显示、多媒体支持和WebKit。在Qt5.2 更是包含串口、蓝牙、手机卫星定位等功能。
       Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单。

QT的优点

  1. 跨平台,几乎支持所有的平台
  2. 接口简单,容易上手,学习QT框架对学习其他框架有参考意义
  3. 一定程度上简化了内存回收机制
  4. 开发效率高,能够快速的构建应用程序
  5. 有很好的社区氛围,市场份额在缓慢上升
  6. 可以进行嵌入式开发

信号和槽机制

  1. 信号
           当对象的内部状态发生改变,信号就会被发射。信号的本质是类内的一个成员函数,但没有函数体。signals 块所列出的,就是该类的信号。信号就是一个个的函数名,返回值是 void(因为无法获得信号的返回值,所以也就无需返回任何值),参数是该类需要让外界知道的数据。信号作为函数名,不需要在 cpp 函数中添加任何实现。
           emit 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏)。
  2. 槽(函数)
           槽是普通的 C++ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽(函数)就会自动调用。槽可以有参数,但槽的参数不能有缺省值。声明一个槽之后必须实现,可以没有任何内容,否则报错。
    槽函数分为三种类型,即 public slots、private slots 和 protected slots。
           public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。
           protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。
           private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。
           Qt 5 中,任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。与信号函数不同,槽函数必须自己完成实现代码。槽函数就是普通的成员函数,因此作为成员函数,也会受到 public、private 等访问控制符的影响。
    (如果信号是 private 的,这个信号就不能在类的外面连接,也就没有任何意义。)
  3. 信号与槽的绑定
    信号发出->与之绑定的槽函数则触发执行。
    connect(sender, sender’signal, receiver, receiver’slot);
    参数说明:
    sender:发出信号的对象
    signal:发送对象发出的信号
    receiver:接收信号的对象
    slot:接收对象在接收到信号之后所需要调用的函数

       该函数是QObject的一个静态方法,所以要使用需要包含对应头文件。
       使用方法

QPushButton *pushButton_2;
QObject::connect(pushButton_2,SIGNAL(clicked()),MainWindow,SLOT(on_quitButton_clicked()));
QObject::connect(pushButton_2,&QPushButton::clicked,&w,&MainWindow::on_quitButton_clicked);

       信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。
       4. 总结
       信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不相干的对象建立一种联系,当接收者连接这个信号时,就可以通过槽函数获得数据。这样就完成了数据从发出者到接收者的一个转移。槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。并且允许我们自定义信号和槽
       只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。
       5. 其它用法:

  • 一个信号可以和多个槽相连,如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。
  • 多个信号可以连接到一个槽,只要任意一个信号发出,这个槽就会被调用。
  • 一个信号可以连接到另外的一个信号,当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值