Qt:在哪里发布连接声明?

时间:2012-10-31 11:19:57

标签: c++ qt

我有一个小部件(mainWidget)和另一个小部件(childWidget),这是它的一个孩子。

我想:

connect(childWidget, SIGNAL(somethingHappened(...)), mainWidget, SLOT(handleIt(...));

我的问题是:是否将connect语句放在mainWidget或childWidget中?

  • 如果我在mainWidget的构造函数和地方创建childWidget 它的工作原理是下一行的连接语句。但是,让我们说吧 childWidget在创建时会执行某些操作然后发出信号 mainWidget成功。你可能有连接的情况 语句只出现在发出的函数(childWidget)之后 信号。

  • 如果我将connect语句放在childWidget的构造函数中,
    问题是它对父母的任何事情都不了解 插槽。如果我让childWidget继承mainWidget,它确实知道了 插槽 - 但这对我来说感觉不好。无法得到它 无论如何要工作。可能有一个正确的方法来做到这一点 - 我还是 找。

我对Qt编程很新。 提前:谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

你应该设计好你的代码,以避免神秘错误的蔓延。在主窗口小部件中编写连接是一个更好的主意,理想情况下,子窗口小部件的构造函数中不应该有一个emit。可能你可以将emit代码移出到另一个块并在构造完成后进行调用。从'mainWidget'对'childwidget'进行子类化只是为了访问它的插槽看起来像一个不灵活的设计。设计应该是这样的,如果任何类知道你的类发出的信号,另一个类应该能够灵活地连接到它。

答案 1 :(得分:1)

在创建子项的类中构造对象后,我总是执行connect调用。原因很简单:创建孩子的对象知道孩子有什么信号/插槽以及它的目的需要什么,但孩子不能和更多的重要性不应该知道。如果孩子对其父母的期望超过必要,则会限制代码的可重用性。

你是对的,任何人都不会听到施工人员的信号。只是不要在构造函数中使用信号,就像在构造函数中不应该使用虚函数一样。如果必须在初始化时发出信号,请编写一个单独的ini函数,并在connect之后调用它。

您还可以使用qobject_cast来确定运行时父级的类型,但这只是糟糕的设计。