c#用户控制事件等价于Qt

本文关键字:等价于 Qt 事件 控制 用户 | 更新日期: 2023-09-27 18:18:22

在c#中,我曾经创建一个用户控件并定义自定义事件来传递数据给我的主类,像这样:

public delegate void MyCustomEventDelegate(int x);
public MyCustomEventDelegate MyCustomEvent;

我是Qt的新手,我了解到Qt中的小部件相当于c#中的用户控件。因此,我创建了一个小部件并将其添加到主窗口中。因为它监听UDP端口,我想把传入的数据传递到主窗口。我如何通过事件做到这一点?如何为小部件创建自定义事件?

c#用户控制事件等价于Qt

在Qt中,您有一个与c#事件/委托相似但不完全相同的架构。

在Qt中,你有信号和插槽。您可以想到的最简单的方法是,信号是一个事件,而插槽是一个事件处理程序。

Qt定义slotssignals宏来帮助您定义这些宏。例如,信号和槽的最简单定义是:

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处理。