元件概念(QWidget)

元件種類


QWidget繼承QObject,是建立使用者界面的主要類別,像主窗口、對話框、標籤、按鈕等元件都繼承自QWidget。沒有嵌入到其他元件內的元件稱為窗口,也就是建置時沒有指定父元件,像一般應用程式的QMainWindow就是一種窗口,也稱為頂級部件(top-level widget),與其相對的是非窗口元件,或稱子元件,像標籤、按鈕等,子元件建置時需指定窗口為其父元件。


父元件與子元件

通常在main()函數內只生成頂層窗口,然後在父元件的建構式內,new出我們需要的子元件,如此一來,只要最頂層的窗口能夠正確釋放記憶體,且父子元件都連接成鏈,每一個組件記憶體就能被正確釋放,不需要我們另外寫delete釋放記憶體。除了在子元件建置時指明父元件,當元件加入到布局管理員,再將布局放到一個窗口時,這個布局管理員和內部所有元件,都會將此窗口當作父元件。


元件建構方式

建置元件有兩種方式,分別建置在stack或heap區,通常頂層窗口建在stack區,子元件建在heap區,當程式結束時,Qt會幫我們將頂層窗口和他所有子元件的記憶體釋放,這邊示範兩種QLabel生成方式。


main.cpp

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel *label1 = new QLabel();
    label1->setText("這是標籤1");
    QLabel label2;
    label2.setText("這是標籤2");
    label1->show();
    label2.show();
    int ret = a.exec();
    delete label1;    //label1需自行釋放記憶體
    return ret;
}

QWidget QWidget


由於我們分配記憶體空間給label1,但沒有指定label1的父元件,所以Qt不會幫我們釋放記憶體,此時要自行釋放,實際上通常不會以此方法建構元件。