zoukankan      html  css  js  c++  java
  • Qt 信号与槽

    在GUI编程中,常常碰到触发控件,引发事件的情况。比如Android中的监听器 listener 和 callback 回调函数。

    在Qt中,相似地,将一个信号发射到一个槽中,就可以做相应的操作。

    信号与槽简介:

    信号(SIGNALS):

      信号是一个特殊的函数,你只用定义它的形參列表,不用提供实现,因为Qt的moc工具会帮你实现。信号都不用自己实现

    槽(SLOTS):

      槽是一个普通的成员函数,唯一“不普通”的地方就是 它的调用方法除了像普通函数那样直接调用它以外,如果相应的信号发射过来了,它也会自动执行。自定义的槽需要自己实现。

    信号与槽的连接:

      信号和槽的参数列表中的参数要一一对应,参数类型也不能写错。允许槽的参数个数少于信号的。这样一来,槽就会相应地忽略掉其他参数。一个信号可以连接多个槽,多个信号可以连接一个槽,一个信号还能和另外一个信号连接(发射一个信号时,另外一个也跟着发射),连接是可以用disconnect来移除的。

    更多:

      对于所有定义了信号与槽的类,在类定义的开始处需要添加Q_OBJECT宏,moc工具看到这个就会去解析,把信号和槽的实现解析成标准的C++代码。(包括实现信号函数和connect函数等等) 更详细地可以去了解Qt的“元对象系统”,阅读有关QMetaObject类的文档,看看由moc生成的C++ 源代码文件 (在你的project目录中,文件名通常为moc_xxx。xxx是你定义了信号和槽的类文件名)。

      信号和槽的机制,不仅仅局限于GUI编程中,可以用于任何QObject的子类中 !  当然,为达到这个地步,必须要高度封装。刚学那会儿,发现标准库中的string类在Qt中竟然有一个对应的QString类,真是满头黑线。

    对使用Qt Designer设计的界面,加入信号和槽:

    1. 使用自带的功能:

      点击控件,右键“加到槽”并选择信号。然后,Qt就会自动在你的界面头文件中加入私有槽定义。并且在界面源文件处提供空函数体的槽函数,自己实现便可。

    2. 自己编写代码:

      在界面的头文件声明槽,在源文件处实现槽。注意槽函数的命名最好遵循规范,像这样: on_objectName_SIGNAL(parameter list)。这样做,有一个好处,就是moc工具会根据你的命名确定 sender、signal、receiver、slot,从而会帮你生成一个connect函数。这样一来,就避免了你忘记调用connect函数,导致该触发的事件没触发的现象了。少写点代码也少点错误。当然了,你可以不这样命名,但是就要自己写好connect调用了 !

      一个例子,其中定义为我的界面类 gotocell 中的一个按钮“cancelButton”的clicked信号绑定了一个槽--on_cancelButton_clicked()

      

    #include "gotocell.h"
    #include "ui_gotocell.h"
    
    gotocell::gotocell(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::gotocell)
    {
        ui->setupUi(this);
    
        //connect(Ui_gotocell::cancelButton,SIGNAL(clicked()),this,SLOT(close()));
    }
    
    gotocell::~gotocell()
    {
        delete ui;
    }
    
    void gotocell::on_cancelButton_clicked()
    {
        this->close();
    }

    也可以自己定义信号,这个就自己摸索吧。

    下面有两个链接,可以进一步了解更深入的东西:

    Qt中Ui名字空间以及setupUi函数的原理和实现

    VS2008 Qt Designer 中自定义信号槽

  • 相关阅读:
    网络学习笔记
    zabbix4.2学习笔记系列
    ansible2.7学习笔记系列
    记一次磁盘UUID不能识别故障处理
    白话ansible-runner--1.环境搭建
    kubernetes的思考
    计算机网络原理精讲第六章--应用层
    计算机网络原理精讲第五章--传输层
    centos7下LVM挂载和扩容
    多线程下载命令--axel
  • 原文地址:https://www.cnblogs.com/zhangzph/p/4599301.html
Copyright © 2011-2022 走看看