簡體   English   中英

Qt小部件和指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM