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