Qt4读书笔记6
来源:互联网 发布:网易云音乐 for mac 编辑:程序博客网 时间:2024/05/16 00:30
深入signals/slots
signals和 slots是Qt编程的基础. 使应用程序能够将对象绑定在一起。我们前面已经定义了一些signals和slots.让我们花一些时间近距离研究一下它的机制。
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自动删除所有连接。
为了实现连接,slot和signal的参数必须相同:
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's的meta-object系统
Qt实现了C++的扩展,建立了独立的组件系统。这个技术被称为meta-object system.提供了两个主要服务:signals-slots和introspection(内省)。内省机制是实现signals/slot所必须的。运行应用程序运行时获取QObject子类的元信息,包括signals和slots列表和其类名。这个机制也支持属性、文本翻译(国际化)。
标准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++源文件。
- Qt4读书笔记6
- qt4读书笔记--layout mangement
- qt4读书笔记--event processing
- Qt4读书笔记1
- Qt4读书笔记2
- Qt4读书笔记3
- Qt4读书笔记4
- Qt4读书笔记5
- Qt4读书笔记7
- Qt4读书笔记8
- Qt4读书笔记9
- Qt4读书笔记10
- Qt4读书笔记11
- Qt4读书笔记12
- Qt4读书笔记13
- Qt4读书笔记14
- Qt4读书笔记15
- Qt4读书笔记5-make问题解决
- 易于在各手机平台移植的设计
- 模拟文件拖拽到指定窗体中。
- USACO 3.1 Stamps
- MFC Windows程序设计读书笔记
- php调用C代码的方法详解
- Qt4读书笔记6
- 写在09年初
- USACO 3.2 Factorials
- [连载]基于消息驱动的面向对象通用C/S应用框架(十六)
- flex开发
- 协议数据单元
- Linux fork 详解
- javascript xml 操作
- 点评2008年九大经济学家惊人语录