代码示例:
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。
答案 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
形成树。父母递归删除它的孩子,你不应该手动管理它们,否则你可能会在某些特定情况下造成双重免费。