Qt学习笔记
父子对象关系
Qt 的父-子对象机制是在 QObject 中实现的。当利用一个父对象创建一个子对象(一个窗口部件,一个效验器,或是任意的其他类型)时,父对象会把这个子对象添加到自己的子对象列表中。当删除这个父对象时,它会便利子对象列表并且删除每一个子对象。然后,这些子对象再去删除它们自己所包含的每个子对象。如此反复递归调用,直至清空所有子对象为止。这种父-子对象机制可在很大程度上简化内存管理工作,降低内存泄露的风险。需要明确删除的对象使那些使用 new 创建的并且没有父对象的对象。并且,如果在删除一个父对象之前删除了它的子对象,Qt 会自动地从它的父对象的子对象列表中将其移除。
内存管理
如果 QWidget 的 parent 为 NULL 或是其他值,在其加入布局管理器或者 QMainWindow 设置 widget 时,会自动将 parent 设置为相应的父 widget,在父控件销毁时这些子控件以及布局管理器对象会一并销毁。
信号与槽
要把信号成功连接到槽(或者连接到另外一个信号),它们的参数必须具有相同的顺序和相同的类型:
conncet(ftp, SIGNAL(rwCommandReply(int, const QString &)), this, SLOT(processReply(int, const Qstring &)));
这里有个例外,如果信号的参数比它所连接的槽的参数多,那么多余的参数将被简单地忽略掉:
conncet(ftp, SIGNAL(rwCommandReply(int, const QString &)), this, SLOT(checkErrorCode(int));
QObject::connect()函数有多重参数形式,一个参数形式的函数原型是:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
使用这种参数形式的 connect()进行信号与槽函数连接时,一般句法如下:
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
这里使用了宏 SIGNAL()和 SLOT()指定信号和槽函数,而且如果信号和槽函数带有参数,还需注明参数类型。
另外一种参数形式的 connect()函数的原型是:
QMetaObject::Connection QObject::conncet(const QObject *sender, const QMetaMethod &signal, const, QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
对于具有默认参数的信号与槽(即信号名称是唯一的,没有参数不同而同名的两个信号),可以使用这种函数指针形式进行关系,如:
conncet(lineEdit, &QLineEdit::textChanged, this, &widget::on_textChanged);
以上语句无需出现函数参数。这在信号的参数比较多时更简便一些。
使用 sender()获得信号发射者
在槽函数里,使用 QObect::sender()可以获取信号发射者的指针。如果知道信号发射者的类型,可以将指针投射为确定的类型,然后使用这个确定类里的接口函数。例如:
QSpinBox *spinBox = qobject_cast<QSpinBox *>(sender());
自定义信号及其使用
在自己设计的类里也可以自定义信号,信号就是在类定义里声明的一个函数,但是这个函数无需实现,只需发射。
事件
当某个窗口第一次显式的时候,就会产生一个绘制事件,用来告知窗口需要重新绘制它本身,从而使得该窗口可见。