3

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

我想要:

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

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

  • 如果我在 mainWidget 的构造函数中创建 childWidget 并将 connect 语句放在下一行,它就可以工作。但是,假设 childWidget 在创建后会执行某些操作,然后向
    mainWidget 发出成功信号。您可能会遇到这样的情况,即连接语句仅出现在发出信号的(childWidget 的)函数之后。

  • 如果我将连接语句放在 childWidget 的构造函数中,
    问题是它不知道任何关于父
    插槽的信息。如果我让 childWidget 继承 mainWidget,它确实知道
    插槽 - 但这对我来说是一个糟糕的解决方案。无论如何都无法让它工作。可能有一种正确的方法可以做到这一点 - 我还在寻找。

我对 Qt 编程很陌生。提前:感谢您的帮助。

4

2 回答 2

1

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

于 2012-10-31T11:28:27.733 回答
1

我总是在创建子类的对象构造之后进行连接调用。原因很简单:创建孩子的对象知道孩子拥有什么信号/插槽以及它需要哪些信号/插槽,但孩子不能知道,更重要的是不应该知道。如果孩子对其父母的期望超过了必要的程度,您将限制代码的可重用性。

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

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

于 2012-10-31T12:02:48.620 回答