2011-04-02 151 views
0

使用Qt小部件(即QLabel)時,爲什麼我們要使用指針?Qt小部件和指針

例如,爲什麼我們寫:

QLabel *label = new QLabel("Hello");

而且,

QLabel label = new QLabel("Hello");

謝謝。

回答

4

因爲如果您將在堆棧上創建它們,它們將在範圍結束後被刪除。

如果你會寫是這樣的:)

void foo() 
{ 
QWidget windget; 
} 

部件將富之後被刪除(被終止。如果使用new,它將一直存在,直到它將被手動刪除(通常由父Widget)。我不認爲QLabel label = new QLabel("Hello");甚至會編譯。可能您需要 QLabel label("Hello");

6

new返回一個指針。如果你通過動態內存分配創建一個對象 - 你顯然必須使用一個指針。

QLabel label = new QLabel("Hello");是不正確的代碼,不會編譯。

爲什麼使用小部件的動態分配?因爲它們必須在函數調用之間活動,就像任何事件驅動的GUI系統一樣。堆棧上的分配(本地對象)將在範圍的末尾釋放,這對於小部件來說效果不佳。

3

我認爲這不是一個Qt問題,這應該是一個C++編程的問題。 您可能以前使用過Java,因爲java沒有指針概念。 我的建議是,在嘗試使用C++和Qt之前,先找一本C++書籍,並學習關於C++指針含義的基本概念和用法。

+0

不能同意更多。 – 2011-04-02 21:18:58

-1

如果你想定義一個沒有指針的var,它看起來像QLabel label; 我們得到的標籤:

  • 位於堆棧上。
  • 不支持多態性。

在C++中,只有通過指針或引用使用var時,var纔會是面向對象的。 Qt是一個面向對象的類庫,所以這就是爲什麼QLabel是用指針定義的。

0

只是要完成,沒有理由不應該爲堆棧分配一些小部件。這對於壽命有限的對象尤其方便,如上下文菜單和模態對話框,您必須等待結果。在這些小部件上,通常會調用exec(),直到用戶關閉它爲止。