QWidget的父母的目的是什么?
What is the purpose of QWidget's parent?
如果我将任何小部件子类化,通常的模式是:
ZTabWidget::ZTabWidget(QWidget *parent):QTabWidget(parent){
blah ... blah ...
}
通常的模式是:
WidgetB widgetb = new WidgetB(widgeta)
widgeta.addWidget(widgetb);
将我的所有小部件分配给MainWindow作为它们各自的父级有什么害处吗?即使按照addWidget层次结构的轨迹,大多数小部件都有另一个小部件作为addWidget父级:
WidgetB widgetb = new WidgetB(mainWindow)
widgeta.addWidget(widgetb);
我之所以希望这样做,是因为mainWindow保存了应用程序的所有主要项,并且我可以让我的任何子类小部件引用这些项。
事实上,我想到的是一个代理小部件,它只是用来保存一些常见的引用,并将该代理小部件用作我所有小部件的公共父级。有什么问题吗?
确切地说,为家长注册QWidget有什么用?父级是否在内部使用?
addWidget父级是否必须与构造函数父级相同?
您的问题实际上有两个方面:
内存管理
QWidgets
(实际上是任何QObjects
)的树状组织是Qt框架中使用的内存管理策略的一部分。将QObject
分配给父对象意味着子对象的所有权将转移到父对象。如果父级被删除,则其所有子级也将被删除。来自文档:
QObjects在对象树中组织自己。当您创建以另一个对象为父对象的QObject,该对象将自动将其自身添加到父级的子级()列表中。父母拥有所有权对象的;即,它将自动删除其析构函数。您可以按名称和可选类型查找对象使用findChild()或findChildren()。
这意味着您可以以任何您认为合理的方式组织小部件(只要您不引入内存泄漏)。然而,我认为将所有小部件分配到它们各自的容器是一种常见的做法(或者显式地,或者更好地,使用addWidget
等方法)。
如果使用addWidget
将小部件分配给QLayout
,则小部件的所有权将转移到布局(而布局可能由另一个周围布局或主窗口拥有)。所以,是的,这个方法定义的关系包括上面描述的更一般的父子关系。
现在,一旦主窗口被破坏,基本上QObjects
的整个树就会被删除,正如您所期望的那样。
因此,如果您将对象保留为"无父对象",则删除该对象是您自己的责任
GUI语义
正如Frank正确指出的那样,在某些情况下,QWidgets
之间的父子关系对GUI框架也具有语义意义。这方面的一个例子是模态对话框,只要它们保持打开,就会阻止它们的父对象。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- QWidget的父母的目的是什么?