【问题标题】:QMainWindow and ownership takeover policyQMainWindow 和所有权接管政策
【发布时间】:2013-05-09 14:48:06
【问题描述】:

我在QMainWindow::setMenuBar(QMenuBar * menuBar) 的文档中偶然发现了这一点:

注意:QMainWindow 取得 menuBar 指针的所有权,并在适当的时候将其删除。

示例代码(在派生自QMainWindow 的类的方法中):

QMenuBar * menuBar = new QMenuBar(this);
setMenuBar(menuBar) // <-- immediately transfer ownership
// use menuBar pointer to add actions, menus, and what not

在调用setMenuBar 之后,我是否仍然可以依赖我的本地指针指向我的QMenuBar?我的意思是,它完全有保障吗?

当我删除我的QMainWindow 派生类时,QMenuBar 对象也被删除,因为QMainWindow 在构造它时被设置为它的父类——但是什么政策在于后来通过setMenuBar 的“所有权接管”除了引用/指针的副本?

【问题讨论】:

    标签: qt


    【解决方案1】:

    是的,只要获得所有权的对象还活着,就可以安全地使用该指针。

    QMainWindow“拥有”菜单这一事实意味着它会在不再需要时将其删除。这在 Qt 中很常见,请参阅 Object Trees & Ownership 文档。

    话虽如此,您的示例代码可以这样重写:

    QMenuBar *menu = menuBar();
    

    如有必要,这将create an empty menu,因此您不必担心任何所有权转让。只要您需要在 Windows 的菜单栏上执行操作,只需调用该成员函数即可。

    【讨论】:

    • 我可能只是使用你的方法,看起来更干净。所以我的两行代码示例可能是多余的?如果 QMenuBar 的构造函数接收到指向 QMainWindow 的指针,那么以后是否需要调用 setMenuBar?
    • 如果你使用menuBar(),你不需要setMenuBar(),你得到的菜单栏已经很好了。你应该使用它,除非我链接的那个文档中关于 Mac OSX 和菜单共享的注释与你有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2021-05-16
    • 2015-05-02
    • 2014-05-19
    • 2019-07-09
    相关资源
    最近更新 更多