Qt提供了一種機制,能夠自動、有效的組織和管理繼承自QObject的Qt對象,這種機制就是對象樹。
Qt對象樹在用戶界面編程上是非常有用的。它能夠幫助程序員減輕內存泄露的壓力。
比如說當應用程序創建了一個具有父窗口部件的對象時,該對象將被加入父窗口部件的孩子列表。當應用程序銷燬父窗口部件時,其下的孩子列表中的對象將被一一刪除。這讓我們在編程時,能夠將主要精力放在系統的業務上,提高編程效率,同時也保證了系統的穩健性。
下面筆者將簡單分析對象樹。
1、
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog *dlg = new QDialog(0);
QPushButton *btn = new QPushButton(dlg);
qDebug() << "dlg = " << dlg;
qDebug() << "btn = " << btn;
dlg->exec();
delete btn;
qDebug() << "dlg = " << dlg;
return 0;
}
程序執行後的調試信息:
dlg = QDialog(0x3ea1a0)
btn =QPushButton(0x3ea228)
關閉窗口後,
dlg = QDialog(0x3ea1a0)
這說明關閉窗口,不會銷燬該窗口部件,而是將其隱藏起來。
我們在
qDebug() << "dlg = " << dlg;
之後加上
qDebug() << "btn = " << btn;
明顯的,我們之前已經delete btn,btn指針沒有被賦值爲0,這是編譯器決定的。
執行程序後,必然出現段錯誤。
2、將程序稍微修改下。
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog *dlg = new QDialog(0);
QPushButton *btn = new QPushButton(dlg);
qDebug() << "dlg = " << dlg;
qDebug() << "btn = " << btn;
dlg->exec();
delete dlg;
qDebug() << "btn = " << btn;
return 0;
}
關閉窗口後,應用程序出現段錯誤了,這很好的說明了對象樹的機制。當銷燬了btn的父窗口部件,btn也會被銷燬。
3、對象樹對應的是父窗口部件和子窗口部件。像佈局管理器添加部件是沒有把添加的部件加入到孩子列表
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog *dlg = new QDialog(0);
QPushButton *btn = new QPushButton(dlg);
QHBoxLayout *layout = new QHBoxLayout(dlg);
layout->addWidget(btn);
QList<QObject *>list = dlg->children();
qDebug() << "dlg children";
for(int i = 0; i < list.size(); i++)
{
qDebug() << list.at(i);
}
list = layout->children();
qDebug() << "layout children";
for(int i = 0; i < list.size(); i++)
{
qDebug() << list.at(i);
}
dlg->exec();
return 0;
}
執行程序後,出現的調試信息如下
dlg children
QPushButton(0x3e98f8)
QHBoxLayout(0x3e9b28)
layout children
layout 的孩子列表是空的。
在這裏附上程序源代碼下載鏈接:http://download.csdn.net/detail/fzu_dianzi/3770632