簡體   English   中英

使用 std::unique_ptr 時 Qt Widget 不顯示

[英]Qt Widget not showing when using std::unique_ptr

我正在嘗試在我的主窗口中動態插入一個新的 QLabel。 如果我不使用 std::unique_ptr 並且我可以看到在我的窗口中繪制的 QLabel ,它就可以正常工作。 為什么我不能使用 std::unique_ptr 或 std::shared_ptr?

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{

 setWindowFlags(Qt::FramelessWindowHint);
 ui.setupUi(this);

 std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>();
 shrd_QLabel->setParent(this);
 shrd_QLabel->setText("test");
 shrd_QLabel->setGeometry(70, 70, 70, 70);
 shrd_QLabel->show();
 //The above doesnt work, however, below example works perfectly

 QLabel * lpQLabel = new QLabel();
 lpQLabel->setParent(this);
 lpQLabel->setText("TEST #2");
 lpQLabel->setGeometry(70, 170, 70, 70);
 lpQLabel->show();
}

您的代碼有兩個問題:

std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>();  // 1
shrd_QLabel->setParent(this);                                 // 2
  1. 您創建一個在作用域結束時釋放的智能指針(當MainWindow構造函數返回時)
  2. 您將QLabel所有權分配給MainWindow ,因此您的QLabel現在有兩個所有者 - 一個是unique_ptr ,第二個是父MainWindow 這是錯誤的,因為雙方都假定他們是唯一的所有者,因此您的Qlabel可能會被釋放兩次。

你的第二個例子是完全有效的。 它可以工作,並且沒有資源泄漏 - 您的QLabel將被其父級MainWindow解除分配。 請注意,而不是:

QLabel * lpQLabel = new QLabel();
lpQLabel->setParent(this);

你可以這樣做:

QLabel * lpQLabel = new QLabel(this); // lpQLabel is owned by `this`

當您使用std::unique_ptr ,對象在作用域的末尾被刪除,所以就像您這樣做:

QLabel *shrd_QLabel = new QLabel;
shrd_QLabel->setParent(this);
shrd_QLabel->setText("test");
shrd_QLabel->setGeometry(70, 70, 70, 70);
shrd_QLabel->show();
delete shrd_QLabel;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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