首页 > 解决方案 > QT:QActionGroup 添加到 QMenu 后,谁是 QActionGroup 成员的父级?

问题描述

此示例中,将少量QAction对象添加到QActionGroup. 然后稍后,将相同的操作添加QMenu为操作。的文档QActionGroup建议通过将 aQAction作为QActionGroup父级传递给QAction构造来添加。但是,我相信向 a 添加操作QMenu会使 QMenu 成为父级。

谁将是示例中的父级(即,首先将操作添加到操作组,然后添加到菜单)?

更一般地说,如果您执行设置父项的操作,父项是否完全转移(即,对象的父项被设置为菜单从 QActionGroup 子列表中删除)?我希望如此,但我无法在任何地方看到此内容,并希望得到确认。

我问是因为我正在做相当无害的动作,但看到的崩溃表明双重释放。

标签: c++qtqt4

解决方案


首先让我们检查使用parent()方法:

...
leftAlignAct = new QAction(tr("&Left Align"), this);
qDebug()<<"0"<<leftAlignAct->parent();
...
alignmentGroup->addAction(leftAlignAct);
qDebug()<<"1"<<leftAlignAct->parent();
...
formatMenu->addAction(leftAlignAct);
qDebug()<<"2"<<leftAlignAct->parent();
...

输出:

0 MainWindow(0x7fffd078fe80) 
1 MainWindow(0x7fffd078fe80) 
2 MainWindow(0x7fffd078fe80) 

显然,父母QAction从未改变,这是在他的创作中确立的,因此QMenuQActionGroup适当的QAction


实际上,您传递给 QAction 的父级不会被 QMenu 或 QActionGroup 更改。QMenu 拥有 QAction 的所有权并不好,因为 QAction 可以是 QMenu 和 QToolBar 的一部分。而在 QActionGroup 中,您的任务是根据其他 QAction 修改状态,无需适当的 QAction。如果要将 QActionGroup 或 QMenu 设置为父级,请使用 setParent()


推荐阅读