【发布时间】:2015-06-03 15:54:26
【问题描述】:
我正在学习 Qt 框架 (C++),并且想知道 QT 是否有任何机制来保护插槽在对象完全初始化之前不被调用。
考虑 A 类构造函数:
A::A() {
mTreeView = new QTreeView();
...
connect(mTreeView, &QTreeView::customContextMenuRequested,
this, &A::OnContextMenuRequested);
...
}
我担心用户可以在 A 的构造函数完成之前右键单击树视图。另一个上下文如下:
A::A() {
mQObj = new MyQObject();
connect(mQObj, &MyQObject::SomeEvent, this, &A::OnEvent);
}
A::InitB() { mB = new B(); }
A::OnEvent() { mB.doSomething(); }
这里可以在 InitB() 运行之前调用 doSomething() 方法。
我需要担心这种情况吗?如果是这样,有没有办法避免这些问题,而不必先初始化所有对象,然后再返回并分别连接事件?
【问题讨论】:
-
如果我的理解是正确的,你必须先调用
mTreeView->show(),然后用户才能与之交互。 -
这是有道理的。因此,我可以通过仅在构造函数末尾显示 UI 元素来降低风险。然而,关于非用户交互事件的问题仍然存在。插槽可以从另一个对象以编程方式发送的信号调用。
-
这是可能的,你必须设计你的代码来防止这种情况发生。
-
您可能只需要担心这个问题,如果您有多个线程正在运行并且其中至少一个可以访问您的对象。 This SO post 对此进行了更多解释。
标签: c++ qt event-handling signals-slots