• QT信号和槽


    什么是信号和槽

    > 信号和槽是QT自行定义的一种通信机制,实现对象之间的数据交互。

    > 当用户或系统触发了一个动作,导致某个控件的状态发生了改变,该控件就会发射一个信号,

    即调用其类中一个特定的成员函数(信号),同时还可能携带有必要的参数

    > 槽和普通的成员函数几乎没有太多区别,可以是公有的、保护的或私有的 ,可以被重载,也可以被覆盖,其参数可以是任意类型 ,并可以像普通成员函数一样调用

    >槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种

    特定信号的处理,可以将槽和其它对象信号建立连接,这样当发射信号时,槽函数将被触发和执行,进而来完成具体功能

       

    信号的定义

    class XX : public Qoject{

      Q_OBJECT        //是一个宏

    signals:

      void signal_func(..);  //信号函数

    };

    Q_OBJECT:

      对于Q_OBECT宏,其是实现任何信号,槽或者属性的强制性要求。不管是否需要实现这些机制,都要求使用这个宏。这个宏包含了Qt中信号和槽的机制。

    宏所对应的Qt里面的一个链接工具(MOC)用于处理语法扩展。在构建工程时,有这种处理语法扩展标记,会把信号和槽的语法扩展还原为标准c++代码,通过c++标准编译器,执行连接。

    注:信号函数只需要声明,不能写定义

    槽的定义

    class XX:public QObject{

      Q_OBJECT

    public slots;

      void slot_func(...){...}  //槽函数

    };

    注:槽函数可以连接到某个信号上,当信号被发射时,槽函数将被触发和执行,而且槽函数也可以当做普通的成员函数直接使用。

    建立信号和槽的连接

    QObject::connect( const QObject*sender, const char*signal,

    const QObject* receiver, const char* method);

    参数∶

      sender∶信号发送对象指针

      signal∶要发送的信号函数,可以使用"SIGNAL(.)" 宏进行类型转换 receiver∶信号的接收对象指针

      method∶接收信号后要执行的槽函数,,可以使用"SLOT()"宏进行类型转换

     只要是QOject类型的指针(不论是QOject或者其子类),都可以作为信号发送者

    案例:创建Qt应用程序,包含标签和按钮,两个控件,实现点击按钮关闭标签

    >按钮点击时发送信号:clicked()

    >实现标签关闭功能的槽:close()

    实现:

    #include "mainwindow.h"
    #include <QApplication>
    #include <QWidget>
    #include<QLabel>
    #include<mainwindow.h>
    #include<QDialog>
    #include<QPushButton>
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
      QDialog parent; //father window
      QLabel label("我是标签",&parent);

      label.move(50,40);
      QPushButton button("我是按钮",&parent);

      button.move(50,140);

      parent.show();    //点击按钮关闭标签
      QObject::connect(&button,SIGNAL(clicked(void),&label,SLOT(close(void));

      MainWindow w;
      w.show();

    return a.exec();
    }

    运行结果:

                                        

    信号和槽连接的语法要求  

    >信号和槽参数要一致

      QObjectconnect(A,SIGNAL(sigfun(int), B,SLOT(slotfun(int));//ok                      QObject:connect(A,SIGNAL(sigfun(int), B,SLOT(slotfun(int,int));//error

    > 可以带有缺省参数

      QObject::connect(A,SIGNAL(sigfun(int)), B,SLOT(slotfun(int,int=O);//ok

    > 信号函数的参数可以多于槽函数,多余参数将被忽略

      QObjectconnect(A,SIGNAL(sigfun(int,int)), B,SLOT(slotfun(int));//ok

    信号和槽连接的应用

    > 一个信号可以被连接到多个槽(一对多)

      QObjectconnect(A,SIGNAL(sigfun(int), B1,SLOT(slotfun1(int))//ok                                   QObjectconnect(A,SIGNAL(sigfun(int),B2,SLOT(slotfun2(int));//ok

    > 多个信号也可以连接到同一个槽(多对一)

      QObjectconnect(A1,SIGNAL(sigfun1(int)), B,SLOT(slotfun(int);//ok                                       QObject::connect(A2,SIGNAL(sigfun2(int),B,SLOT(slotfun(int);//ok

    > 两个信号可以直接连接(信号级联) //用于消息传递

      QObject::connect(A1,SIGNAL(sigfun1(int), A2,SIGNAL(sigfun2(int));//ok

  • 相关阅读:
    cookie和session的区别和用法
    JavaScript深浅拷贝
    前端知识
    typescript -- ts
    vue笔记精华部分
    宜人贷项目里-----正则匹配input输入月份规则
    PHP-Socket-阻塞与非阻塞,同步与异步概念的理解
    PHP socket客户端长连接
    PHP exec/system启动windows应用程序,执行.bat批处理,执行cmd命令
    查看局域网内所有ip
  • 原文地址:https://www.cnblogs.com/LaiY9/p/14596015.html
Copyright © 2020-2023  润新知