在c#中,我曾经创建一个用户控件并定义自定义事件来传递数据给我的主类,像这样:
public delegate void MyCustomEventDelegate(int x);
public MyCustomEventDelegate MyCustomEvent;
我是Qt的新手,我了解到Qt中的小部件相当于c#中的用户控件。因此,我创建了一个小部件并将其添加到主窗口中。因为它监听UDP端口,我想把传入的数据传递到主窗口。我如何通过事件做到这一点?如何为小部件创建自定义事件?
在Qt中,您有一个与c#事件/委托相似但不完全相同的架构。
在Qt中,你有信号和插槽。您可以想到的最简单的方法是,信号是一个事件,而插槽是一个事件处理程序。
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
处理。