Qt4读书笔记6

Qt信号槽详解
本文深入探讨了Qt中的信号槽机制,介绍了如何定义和使用信号与槽,包括多种连接方式及其实现原理。此外,还详细解释了Qt元对象系统的工作流程。

深入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(const QString &)), 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; }

       int salary() const { return mySalary; }

public slots:

       void setSalary(int newSalary);

signals:

       void salaryChanged(int newSalary);

private:

       int mySalary;

};

void Employee::setSalary(int newSalary)

{

       if(newSalary != mySalary) {

              mySalary = newSalary;

              emit salaryChanged(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++源文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值