C++ 使用std::unique\u ptr时未显示Qt小部件

C++ 使用std::unique\u ptr时未显示Qt小部件,c++,qt,c++11,C++,Qt,C++11,我正在尝试在主窗口中动态插入一个新的QLabel。如果我不使用std::unique_ptr,并且可以在窗口中看到正在绘制的QLabel,那么它就可以正常工作。为什么我不能使用std::unique\u ptr或std::shared\u ptr MainWindow::MainWindow(QWidget *parent):QMainWindow(parent) { setWindowFlags(Qt::FramelessWindowHint); ui.setupUi(this);

我正在尝试在主窗口中动态插入一个新的QLabel。如果我不使用std::unique_ptr,并且可以在窗口中看到正在绘制的QLabel,那么它就可以正常工作。为什么我不能使用std::unique\u ptr或std::shared\u 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 = new QLabel;
shrd_QLabel->setParent(this);
shrd_QLabel->setText("test");
shrd_QLabel->setGeometry(70, 70, 70, 70);
shrd_QLabel->show();
delete shrd_QLabel;
当您使用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;

您的代码有两个问题:

std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>();  // 1
shrd_QLabel->setParent(this);                                 // 2
你可以做:

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

您的代码有两个问题:

std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>();  // 1
shrd_QLabel->setParent(this);                                 // 2
你可以做:

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

你并不真正拥有小部件,窗口拥有,它将处理小部件的所有生命周期管理,包括在你的窗口被销毁时确保它被销毁。这就是这里所有的亲子关系。因此,不需要新的智能指针,它们有自己的和单独的生命周期管理,在这种情况下与Qt中的生命周期管理冲突。请不要使用QMainWindow。简单地从QWidget派生。QMainWindow提供特定的停靠功能-如果您不使用它,您就不需要QMainWindow。您并不真正拥有小部件,窗口拥有,它将处理小部件的所有生命周期管理,包括确保在销毁窗口时销毁小部件。这就是这里所有的亲子关系。因此,不需要新的智能指针,它们有自己的和单独的生命周期管理,在这种情况下与Qt中的生命周期管理冲突。请不要使用QMainWindow。简单地从QWidget派生。QMainWindow提供特定的停靠功能-如果不使用它,则不需要QMainWindow。