在C#中,我曾经创建一个用户控件并定义自定义事件,将数据传递给我的主类,如下所示:
public delegate void MyCustomEventDelegate(int x);
public MyCustomEventDelegate MyCustomEvent;
我是Qt的新手。我了解到Qt中的小部件等同于C#中的用户控件。所以我创建了一个小部件并将其添加到我的主窗口。由于它侦听UDP端口,我想将传入的数据传递给主窗口。我怎么能通过活动来做到这一点?如何为窗口小部件创建自定义事件?
答案 0 :(得分:4)
在Qt中,你有一个与C#events / delegates类似但不完全相同的架构。
在Qt, you have signals and slots。您可以想到的最简单的方法是信号是一个事件,而一个插槽是一个事件处理程序。
Qt定义了slots
和signals
宏来帮助您定义这些宏。例如,信号和插槽的最简单定义是:
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
....
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
你把它们连接起来:
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
这里调用a.setValue
相当于在C#中引发事件。您可以在我发布的链接中阅读更多细节。
在您的情况下,您需要在窗口小部件中定义一个或多个信号,并在主窗口中定义一个或多个插槽。当窗口小部件添加到窗口时,您可以connect
。