qt學習筆記(六)之簡析對象樹

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

以上純屬個人學習筆記,如果哪裏錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:[email protected]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章