QT:QActionGroup 添加到 QMenu 后,其成员的父对象是谁?

QT: Who is the parent of members of a QActionGroup after it is added to a QMenu?

this example 中,QAction 个对象被添加到 QActionGroup。然后稍后,将相同的操作添加到 QMenu 作为操作。 QActionGroup 的文档建议通过将 QActionGroup 作为父级传递给 QAction 构造来添加 QAction。但是,我相信向 QMenu 添加一个动作会使 QMenu 成为父级。

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

更一般地说,如果您执行设置父级的操作,父级是否完全传输(即,对象的父级设置为菜单 并且 从 QActionGroup 中删除子列表)?我希望如此,但我在任何地方都看不到这篇文章,希望得到确认。

我问这个问题是因为我正在执行相当无害的操作,但我看到了提示双重释放的崩溃。

首先让我们使用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 的parent 不会被QMenu 或QActionGroup 改变。 QMenu 拥有 QAction 的所有权并不好,因为 QAction 可以是 QMenu 和 QToolBar 的一部分。而在 QActionGroup 中,您的任务是根据其他 QAction 修改状态,不需要适当的 QAction。如果您想将 QActionGroup 或 QMenu 设置为父级,请使用 setParent()