Qt中的C#用户控件事件等效

时间:2014-08-16 19:57:29

标签: c# qt user-controls event-handling widget

在C#中,我曾经创建一个用户控件并定义自定义事件,将数据传递给我的主类,如下所示:

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

我是Qt的新手。我了解到Qt中的小部件等同于C#中的用户控件。所以我创建了一个小部件并将其添加到我的主窗口。由于它侦听UDP端口,我想将传入的数据传递给主窗口。我怎么能通过活动来做到这一点?如何为窗口小部件创建自定义事件?

1 个答案:

答案 0 :(得分:4)

在Qt中,你有一个与C#events / delegates类似但不完全相同的架构。

Qt, you have signals and slots。您可以想到的最简单的方法是信号是一个事件,而一个插槽是一个事件处理程序。

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