如果QMenu是unique_ptr,为什么QAction没有添加到QMenu?

时间:2015-06-14 18:31:43

标签: c++ qt

代码示例:

auto fileMenu = std::make_unique<QMenu>(this->menuBar()->addMenu("First"));
fileMenu->addAction("AFirst");

auto x = this->menuBar()->addMenu("Second");
x->addAction("ASecond");

结果:

我在菜单栏中有2个菜单,但在第一个菜单中 - 由于某种原因,没有任何操作。第二个菜单正确有效。

我尝试了不同的方法,比如类成员指针,等等,但这是最短的例子 - 如果QMenu是unique_ptr,则缺少QAction。有人能为我解释一下吗?父窗口是QMainWindow,以防万一。

系统信息: Win8.1 x64,编译器是VS2013,Qt 5.4 x32。

1 个答案:

答案 0 :(得分:4)

在这一行:

auto fileMenu = std::make_unique<QMenu>(this->menuBar()->addMenu("First"));

fileMenu成为新的QMenu对象(使用this constructor)。它与:

完全相同
std::unique_ptr<QMenu> fileMenu(new QMenu(this->menuBar()->addMenu("First")));

然后,您将QAction添加到此临时新菜单中。

在第二种情况下:

auto x = this->menuBar()->addMenu("Second");
x->addAction("ASecond");

x成为指向现有菜单的指针。这就是区别。

无论如何,通常你不应该使用QObject持有std::unique_ptr。在Qt中,有一个约定,即通过为每个树分配父级,从QObject形成树。父母递归删除它的孩子,你不应该手动管理它们,否则你可能会在某些特定情况下造成双重免费。