如何在Qt中捕获子Widget的更改?

时间:2012-10-22 20:43:41

标签: c++ qt event-handling qwidget

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

快速和肮脏的方式是像往常一样使用connect(),然后在你的插槽方法中,调用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()(或其他)连接到同一个插槽,您可能必须更新someWidgetsStateChanged()实现以适当地处理它。尽管如此,这仍然有效,并且不需要付出很多努力来实现。

答案 2 :(得分:0)

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

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

相关问题