Qt小部件不显示时使用std::unique_ptr
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;
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 为什么 std::unique 不调用 std::sort?
- 我对 std::unique(算法)C++有问题
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- std::unique 是否有大小限制
- 从 std::unique 返回的迭代器的用法
- 使 std::unique<T> 与 std::unique<const T, CustomDeleterType 兼容>
- Std::list.unique()应该使迭代器无效
- 无法使用初始化器列表构造 vector<std::unique<...>>
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- 我能保证std::unique将保留第一个元素吗?
- 在 std::vector<std::unordered_set上使用 std::unique(<T>>