我正在尝试将新的 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
的构造函数返回时) - 您分配 ownership您的
QLabel
到MainWindow
,所以您的QLabel
现在有两个所有者 - 一个是unique_ptr
,第二个是父级主窗口
。这是错误的,因为双方都假定他们是唯一所有者,因此您的Qlabel
可能会被释放两次。
你的第二个例子是完全有效的。它有效,并且没有资源泄漏 - 您的 QLabel
将由其父级 MainWindow
释放。请注意,不是:
QLabel * lpQLabel = new QLabel();
lpQLabel->setParent(this);
你可以这样做:
QLabel * lpQLabel = new QLabel(this); // lpQLabel is owned by `this`
关于c++ - 使用 std::unique_ptr 时 Qt Widget 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815435/