zoukankan      html  css  js  c++  java
  • 【Qt】2.2 继续了解信号和槽

    槽和普通成员函数一样,可以是虚函数、被重载,可以是公有、私有、保护的。它可以被其它C++成员函数调用。

    槽连接了信号,当发射这个信号时,槽会被自动调用。

    连接函数:

    bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )

    sender和receiver是指向QObject的指针。

    signal和method是不带参数名的函数,需要使用宏SIGNAL()和SLOT()。

    一个信号可以连接多个槽,例如:

    connect(okButton, SIGNAL(clicked(bool)),

        checkBox1, SLOT(click()));

    connect(okButton, SIGNAL(clicked(bool)),

         checkBox2, SLOT(click()));

    当点击okButton时,checkBox1和checkBox2都会执行各自的槽click()。

    多个信号可以连接同一个槽,例如:

    connect(okButton, SIGNAL(clicked(bool)),

    checkBox1, SLOT(click()));

    connect(cancelButton, SIGNAL(clicked(bool)),

         checkBox1, SLOT(click()));

    点击okButton或cancelButton时,checkBox1都会执行槽click()。

    一个信号可以与另个一个信号连接,例如:

    connect(okButton, SIGNAL(clicked(bool)),

        checkBox1, SLOT(click()));

    connect(cancelButton, SIGNAL(clicked(bool)),

         okButton, SIGNAL(clicked(bool)));

    当点击cancelButton时,会由okButton的信号clicked(bool)做响应,okButton会发射信号clicked(bool),从而checkBox1的槽click()会自动执行。

    另外,cancelButton的信号clicked(bool)中的bool参数会传递给okButton的信号clicked(bool)中的bool参数。

    在这里okButton的clicked(bool)信号被当作槽来使用,槽中有多少个参数,就会要求发射信号的函数至少要带有多少个参数,否则连接是不成功的。

    连接可以被移除,例如:

    connect(okButton, SIGNAL(clicked(bool)),

        checkBox1, SLOT(click()));

    disconnect(okButton, SIGNAL(clicked(bool)),

         checkBox1, SLOT(click()));

    当删除对象时,Qt会自动删除与这个对象相关的所有连接。

    信号的参数数量至少是槽的参数数量。

    1.例如:

    connect(okButton, SIGNAL(clicked(bool)),

        checkBox1, SLOT(click()));

    当发射信号时,信号的bool参数是没有用的。

    2.例如:

    connect(okButton, SIGNAL(clicked(bool)),

    checkBox1, SLOT(setHidden(bool));

    当发射信号时,信号的bool参数会传递给槽的bool参数。

    3.例如:

    connect(checkBox1, SIGNAL(released()),

    cancelButton, SLOT(setVisible(bool)));

    这是错误的,槽要求一个bool参数,信号也必须有这一个bool参数。

    4.例如:

    connect(this, SIGNAL(send(bool, int, double)),

         this, SLOT(recive(bool, int)));

    信号的参数个数可以大于等于槽的参数个数,同时信号和槽的各个参数位置需要对应。

    在这里,信号的第三个参数double类型不会被传递到槽。

    在成员函数中手动发射信号,使用emit,例如:

    在对象创建时,构造函数就已经连接了setVal信号和recive槽。

    当对象调用SetValue()函数时,全发射setVal信号,同时传入相应的参数值,发射信号之后会由recive槽接收,设置val变量的值。

    好咯,这一节的总结就到这里~

  • 相关阅读:
    sql server 纵横表的转换
    url参数的编码解码Demo
    SqlServer 列的增加和删除
    asp.net下ajax.ajaxMethod使用方法(转)
    js中document.all 的用法
    cookie跨域,跨目录访问及单点登录。
    错误记录:html隐藏域的值存字符串时出错
    .NET下用C#实现邮箱激活功能
    js与C#服务端 json数据交互
    sqlserver数据可空插入报错
  • 原文地址:https://www.cnblogs.com/recordprogram/p/5671775.html
Copyright © 2011-2022 走看看