zoukankan      html  css  js  c++  java
  • QT信号槽的六个优点(虽然直接调用函数也可解决问题,但要在具体的函数中传递指针,多对一和解除关系也够麻烦的)

            信号槽是Qt中特有的概念。它使得程序员将不同的object绑定起来,而object对象间并不需要对相互了解。 Slots也是普通的c++方法,它们可以是virtual;可以被重载;可以使private、protected、public,可以像其它c++方法一样有各种类型的参数,Signals则无这些属性。它们唯一的区别就是signal与slot是相互链接起来的,slot函数在每次signal函数被emit时会被调用。

    声明信号,跟函数不一样,不需要定义

    signals:

    void mySignal();

    void mySignal(int x);

    void mySignalParam(int x,int y);


    在用到的地方发送信号(先建立了信号与槽的连接,才能接受信号)

    emit mySignal();

    声明槽,slots有public等属性,槽就相当于定义的一个函数,在里面实现某些功能。

    public slots:

    void mySlot();

    void mySlot(int x);

    void mySlot(int x,int y);

           连接信号signal和槽函数slot:

           connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()));

           sender和receiver是QObject对象的指针,signal和slot函数是不带参数的函数名,实际上SIGNAL()和SLOT()宏将他们的参数(signal和slot函数)转换成相应的字符串。

    注意

    1、一个信号可以连接到多个槽:
    connect(sender, SIGNAL(mySignal(int)),receiver1, SLOT(mySlot(int)));
    connect(sender, SIGNAL(mySignal(int),receiver2, SLOT(mySlot(int)));
    当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。

    2、多个信号可以连接到同一个槽
    connect(sender1 SIGNAL(mySignal1()), receiver, SLOT(mySlot()));
    connect(sender2, SIGNAL(mySignal2()),receiver, SLOT(mySlot()));
    任何一个信号发出,槽函数都会执行。

    3、一个信号可以和另一个信号相连
    connect(sender, SIGNAL(mySignal1()),
                  this, SIGNAL(mySignal2()));
     第一个信号发出后,第二个信号也同时发送。除此之外,信号与信号的连接和信号与槽连接相同。
     
    4、连接可以被删除
    disconnect(sender, SIGNAL(mySignal()),receiver, SLOT(mySlot()));
    这个函数很少使用,因为当一个对象被删除后,Qt自动删除这个对象的所有连接。

    5、参数设置

        信号和槽函数必须有着相同的参数类型及顺序,这样信号和槽函数才能成功连接:
    connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int, const QString &)));
    如果信号里的参数个数多于槽函数的参数,多余的参数被忽略:
    connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int)));

    6、获得对象

    QObject * QObject::sender () const [protected]

    sender () 函数返回 信号发出者 的 QObject型指针。

    对QObject型指针进行强制转换得到需要的。

    在槽函数里使用得到信号发送对象。

    例如:

    mySlot(){

        currentGlWidget = qobject_cast<GLWidget *>(sender());

        QPushButton* btn= dynamic_cast<QPushButton*>(sender())

    }

    带返回值的信号槽

    槽函数有返回值

    可通过  value = emit mysignal() 得到返回值。

    http://blog.csdn.net/zmy3376365/article/details/7590987

  • 相关阅读:
    Python的招牌花旦
    Python的for循环究竟是什么回事儿
    人人都喜欢用的十大python标准库
    有编程基础学python怎么赚点小钱?
    python3 Flask Redis 如何切换数据库
    贪心算法
    【ACM】nyoj_106_背包问题_201308152026
    【ACM】nyoj_14_会场安排问题_201308151955
    【ACM】nyoj_132_最长回文子串_201308151713
    【ACM】nyoj_47_过桥问题_201308151616
  • 原文地址:https://www.cnblogs.com/findumars/p/6283424.html
Copyright © 2011-2022 走看看