0

我有一些动态添加的 QWidgets,我想在它们更改时执行一些任务。
我想我不能使用 connect() 因为我还需要触发更改的 QWidget 的名称。
我如何才能看到哪个 QWidget 已更改,并且仍然使用通用处理程序捕获值更改事件?

4

3 回答 3

1

在事件传递给 QObject 子类实例之前使用它来捕获事件:http: //qt-project.org/doc/qt-4.8/qobject.html#installEventFilter

于 2012-10-22T20:51:35.213 回答
1

快速而简单的方法是像往常一样使用 connect(),然后在你的 slot 方法中,调用 sender() 来找出哪个对象发送了信号。例如:

// slot method that you've connected all of your widgets' stateChanged(int) signals to
void MyClass :: someWidgetsStateChanged(int newState) 
{
   const QObject * s = sender();

        if (dynamic_cast<const QCheckBox *>(s) == _myFirstCheckbox) printf("First checkbox is now %s\n", newState?"Checked":"unchecked");
   else if (dynamic_cast<const QCheckBox *>(s) == _mySecondCheckbox) printf("Second checkbox is now %s\n", newState?"Checked":"unchecked");

   [... and so on...]
}

请注意,这被认为是“脏”的原因是它破坏了封装。特别是,上面的 someWidgetsStateChanged() 方法现在的行为会有所不同,具体取决于生成信号的对象,因此,例如,如果将来某个时候您将 QPushButton::clicked() (或其他)连接到同一个插槽,您' d 可能必须更新 someWidgetsStateChanged() 实现以适当地处理它。尽管如此,这仍然有效,并且不需要付出很多努力来实施。

于 2012-10-22T21:43:20.080 回答
0

经过一些额外的思考后,我想说为什么不扩展这些控制器呢?这样我就可以使用 parent() 或使用自定义构造函数将它们挂钩到父对象。

尽管我将它们定义为朋友类,但它可能需要...

于 2012-10-27T19:48:14.320 回答