1、Qt Designer:界面设计编辑工具
2、Qt Assistant: Qt技术文档浏览器
3、Qt Linguist: 国际化语言翻译工具
4、Qt Creator: 集成开发环境
使用new和 delete时,内存在堆中分配。堆内存空间必须通过delete完全释放,以防止内存泄漏。只要不delete,分配在堆上的对象可以一直存活下去。
栈是系统自动分配管理的,局部变量就是来自于栈区,只要超出了作用域的栈区数据就会被自动回收。
所有从QObject继承出来的子对象的内存管理都转移给了父对象
1、使用new在堆上分配内存
2、子对象可自动被父对象删除内存
3、手动删除不会引起二次删除,子对象删除时会通知父对象
没有父对象的对象需要手工删除
没有父对象的对象一般分配在栈区,这样可以有效避免内存泄漏。
Qt没有自动回收站的机制,需要关注父子关系及其功能
在构造对象时候指定父对象
QObject(QObject * parent = 0)QObject
可以修改它所属的父对象
void QObject : :setParent(QObject * parent)
得到子对象
QObjectList & QObject : :children()
得到父对象
QObject *QObject : : parent ()
手工删除有父对象的从QObject继承的子对象
void QObject : :deleteLater()
信号和槽机制是Qt的一个主要特征,是Qt与其它工具包最不相同的部分。通过反馈的方式动态地或松散地将事件和状态变化联系起来。
Qt工作的原理:事件驱动,信号槽机制。
回调( callback)是一个函数指针,当一个事件发生时被调用,任何函数都可以被安排作为回调。
1、没有类型安全
2、总是以直接调用方式工作
信号和槽的方式更加动态
1、一个更通用的机制
2、更容易互连两个已存在的类
3、相关类之间涉及更少的知识共享
Qt采用信号和槽实现对象部件之间的通信。
能携带任意数量和任意类型的参数,取代原始的回调和消息映射机制
面向对象,独立于标准C/C++,必须借助QT工具moc ( Meta Object Compiler ),C++预处理程序,为高层次事件处理自动生成所需要附加代码必须把事件和相关代码联系起来,才能对事件做出响应。才能使不同类型的对象之间能够进行通信
当信号被发射时,QT代码将回调与其相连接的槽函数
信号将由元对象处理moc自动翻译成C++代码
信号的声明不在.cpp文件中,而在头文件中
Q_OBJECT
... ...signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x, int y);
槽函数是普通的C++成员函数,可以被正常调用
槽函数可以有返回值,也可以没有。
槽函数的访问权限三种: public slots、private slots和protected slots。槽函数的存取权限决定了谁能够与其相关联头文件中中声明
_OBJECT... . . .
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y) ;
原型︰
QMetaObject::Connection QObject::connect(const QObject * sender,const char * signal,const QObject * receiver,constchar * method,Qt : :ConnectionType type = Qt ::AutoConnection);
槽函数执行方式分为︰自动、直接、队列、阻塞队列等等。
信号与槽关联
QObject::sconnect( sender,SIGNAL(signal) , receiver,SLOT(method));
信号与信号相连
QObject::connect( sender,SIGNAL(signal),receiver,SIGNAL(signal) );
同一个信号连接到多个槽
QObject ::connect( sender,SIGNAL(signal) , receiver,SLOT(method1) ) ;
QObject::connect( sender,SIGNAL(signal) , receiver,SLOT(method2) );
多个信号连接到同一个槽
QObject::connect( sender,SIGNAL(signal1), receiver,SLOT(method));
QObject ::connect( sender,SIGNAL(signal2) , receiver,SLOT(method));
signal一般是在事件处理时候Qt发出,如果需要程序自己触发信号,则使用emit。使用语法如下︰
emit signal
如果不需要连接信号槽的时候,可以取消连接。
函数原型(有多个版本,函数重载)︰
bool QObject:.disconnect(const QObject * sender,const char * signal,const QObject * receiver,const char * method) ;
取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有连接