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;
}