[英]Qt widgets and pointers
使用Qt
小部件(即QLabel)時,為什么要使用指針?
例如,為什么我們寫:
QLabel *label = new QLabel("Hello");
而且, 不是 :
QLabel label = new QLabel("Hello");
?
謝謝。
new
返回一個指針。 如果通過動態內存分配創建對象,則顯然必須使用指針。
QLabel label = new QLabel("Hello");
是錯誤的代碼,將無法編譯。
為什么為小部件使用動態分配? 因為它們必須在函數調用之間保持活動狀態,就像任何事件驅動的GUI系統一樣。 堆棧(本地對象)上的分配將在作用域的末尾釋放,這不適用於小部件。
因為如果要在堆棧上創建它們,它們將在作用域結束后刪除。
如果您將編寫如下內容:
void foo()
{
QWidget windget;
}
foo()終止后,小部件將被刪除。 如果使用new
,它將一直存在,直到將其手動刪除(通常由父Widget)刪除為止。
我不認為QLabel label = new QLabel("Hello");
甚至可以編譯。 您可能會QLabel label("Hello");
我認為這不是Qt問題,這應該是C ++編程問題。 您可能以前使用過Java,因為Java沒有指針概念。 我的建議是,在嘗試使用C ++和Qt之前,找到一本C ++書籍並學習有關C ++指針的含義的基本概念和用法。
只是為了完整起見,沒有理由不應該在堆棧上分配一些小部件。 這對於使用壽命有限的對象尤其方便,例如上下文菜單和模式對話框,您必須等待結果。 在這些窗口小部件上,您通常調用exec(),該函數將阻塞直到用戶將其關閉。
如果要定義不帶指針的QLabel label
,則它看起來像QLabel label
; 我們得到的標簽:
在c ++中,僅當通過指針或引用使用var時,它才會是面向對象的。 Qt是一個面向對象的類庫,因此這就是QLabel
用指針定義的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.