Qt4读书笔记6

来源:互联网 发布:网易云音乐 for mac 编辑:程序博客网 时间:2024/05/16 00:30

深入signals/slots

signals slotsQt编程的基础. 使应用程序能够将对象绑定在一起。我们前面已经定义了一些signalsslots.让我们花一些时间近距离研究一下它的机制。

slots用来标识普通的C++成员函数。他们可能是虚函数;也可能是重载函数;访问权限可以是public,protected或者private. 他们可以象其他C++成员函数一样被调用;他们的参数可以是任意类型。与普通函数的唯一区别是slot能够连接到一个signal,signal发出时,slot被自动调用。

 

connect()的语法:

connect(sender, SIGNAL(signal), receiver,SLOT(slot));

 

几种调用方式:

-一个signal对应多个slots

conncet(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));

connect(slider, SIGNAL(valueChanged(int)),this,   SLOT(updateStatusBarIndicator(int)));

多个slots的调用顺序是不确定的。

--多个signal对应一个slot

connect(lcd, SIGNAL(overflow()), this,SLOT(handleMathError()));

connect(calculator,SIGNAL(divisionByZero()), this, SLOT(handleMathError()));

--一个signal连接到另一个signal

connect(lineEdit, SIGNAL(textChanged(constQString &)), this, SIGNAL(updateRecord(const QString &)));

当第一个signal发生时,第二个signal也发出。

--删除连接

disconnect(lcd, SINGAL(overflow()), this,SLOT(handleMathError()));

删除连接基本是不必要的,因为对象删除时,Qt自动删除所有连接。

 

为了实现连接,slotsignal的参数必须相同:

connect(ftp, SIGNAL(rawCommandReply(int,const QString &)), this, SLOT(processReply(int, cont QString &)));

例外:当signal参数多于slot时,多余的参数被忽略:

connect(ftp, SIGNAL(rawCommandReply(int,const QString &)), this, SLOT(checkErrorCode(int)));

 

到目前为止,我们仅仅在组件(widgets)上使用slot/signal技术。时间上QObject的这个实现机制不限于GUI编程,这个机制可用于任何QObject的子类。

 

class Employee : public QObject

{

       Q_OBJECT

public:

       Employee(){ mySalary = 0; }

       intsalary() const { return mySalary; }

public slots:

       voidsetSalary(int newSalary);

signals:

       voidsalaryChanged(int newSalary);

private:

       intmySalary;

};

void Employee::setSalary(int newSalary)

{

       if(newSalary!= mySalary) {

              mySalary= newSalary;

              emitsalaryChanged(mySalary);

       }

}

注意只有当不相等时才发送salaryChanged(),这就确保不产生无限循环。

Qt'smeta-object系统

Qt实现了C++的扩展,建立了独立的组件系统。这个技术被称为meta-object system.提供了两个主要服务:signals-slotsintrospection(内省)。内省机制是实现signals/slot所必须的。运行应用程序运行时获取QObject子类的元信息,包括signalsslots列表和其类名。这个机制也支持属性、文本翻译(国际化)。

 

标准C++不支持动态元信息。Qt提供了moc工具来解决这个问题。moc分析Q_OBJECT类,并通过C++函数是信息可用。 MOC使用了C++的函数功能,所以Qt元数据系统能够工作在任何C++编译器。

工作流程:

-- Q_OBJECT宏定义一些内省函数,包括metaObject(), tr(), qt_metacall()

-- moc工具生成实现函数(Q_OBJECT声明的和所有signals)

-- QObject成员函数connect(), disconnect()使用内省函数完成其工作。

所有这些都是通过qmake, moc, QObject自动完成的,如果你好奇,可以阅读QMetaObject的文档并查看moc生成的C++源文件。

 

原创粉丝点击