[英]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
MainWindow
構造函數返回時)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.