signals/slots(信号/槽)

QT-- write once ,compile anywhere.

2011-08-23 星期二 雨(处暑)

 Qt的核心机制————信号-槽机制,区别于其他GUI工具的最主要特征。

 

信号(signal):

当某个信号所对应的客户或其他所有者的内部状态发生改变时,信号被一个对象发射。只有定义过这个信号的类及其派生

类能够发射这个信号。

 

槽(slot):

被用于接收信号,它们通常是类中的成员函数,一个槽并不知晓是否有一个信号与自己联系,同样,包含有槽函数的对象

也对通信机制一无所知,它们也可以作为一个独立的软件构件。

example:

头文件

/*signaltest.h*/
#ifndef SIGNALTEST_H
#define SIGNALTEST_H
#include <QObject>

class myTest :public QObject
{
    Q_OBJECT
public:
    myTest()
    {
        m_value = 0;
    }

    int getvalue()
    {
        return m_value;
    }

public slots:   //槽函数的定义
    //槽函数就是类的成员函数,可以将槽函数当做是普通的成员函数来使用
    //槽函数可以和特定的信号(其他槽函数)进行关联(连接),使得当特定的对象发处指定的信号的时候,自动的调用该槽函数
    //槽函数一般为void类型的返回,可以带参数也可以不带

    void setvalue(int new_value)
    {
        if(new_value != m_value)
        {
            m_value = new_value;
            //emit用来发出指定的信号
            emit valueChanged(m_value); //发送信号
        }
    }

signals: //定义信号
    //信号为void类型返回值的函数,可以传递参数,并且在类中不需要函数的实现
    //信号函数的实现由MOC自动完成
    void valueChanged(int new_value);

private:
    int m_value;
};

#endif // SIGNALTEST_H

 

主函数

#include <QApplication> #include <QDebug>

#include "signaltest.h"

int main(int argc, char *argv[]) {     QApplication app(argc, argv);     myTest x, y;

    qDebug()<<"x.m_value = "<<x.getvalue();     qDebug()<<"y.m_value = "<<y.getvalue();

    //信号和槽函数必须进行关联     //关联以后,当特定的对象(sneder)发出了指定的信号的时候,指定的对象(recerver)会自动的执行相关联号的槽函数(或者发出相关联的信号)     QObject::connect(&x, SIGNAL(valueChanged(int)), &y, SLOT(setvalue(int)));     x.setvalue(123);

    qDebug()<<"x.m_value = "<<x.getvalue();     qDebug()<<"y.m_value = "<<y.getvalue();

    QObject::connect(&y, SIGNAL(valueChanged(int)), &x, SLOT(setvalue(int)));     y.setvalue(234);

    qDebug()<<"x.m_value = "<<x.getvalue();     qDebug()<<"y.m_value = "<<y.getvalue();

    //return app.exec();     return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值