使用Qt信号和槽实现C++回调

3
我创建了一个库,具有以下接口和回调。我想使用QT信号和槽来实现它。
是否可以用信号和槽替换IWifiCameraDiscovery?
class IWifiCameraDiscovery
{
    public:

      virtual int InitialiseWiFiDiscovery(IWifiCameraEnumerationCallback*) = 0;


      virtual void UnInitialiseWiFiDiscovery() = 0; 


      virtual int   EnumerateWiFiDevice() = 0;  
 };

  class IWifiCameraEnumerationCallback
  {
  public:

virtual void onWiFiDeviceDiscovered( WiFiDeviceInfo* pDeviceInfo,unsigned short nNoOfDevice) = 0;   


virtual void onDiscoveryTimeout() = 0;
 };
2个回答

2
是的,这很简单明了。
class IWifiCameraDiscovery
{
public:
    virtual int InitialiseWiFiDiscovery() = 0;    
    virtual void UnInitialiseWiFiDiscovery() = 0;     
    virtual int EnumerateWiFiDevice() = 0; 

signals: 
    void onWiFiDeviceDiscovered(WiFiDeviceInfo* pDeviceInfo, unsigned short nNoOfDevice);   
    void onDiscoveryTimeout();
};

在您的实现中,不要直接调用回调函数:

callback.onWiFiDeviceDiscovered(pDevInfo, x);

您需要发射一个信号:
emit onWiFiDeviceDiscovered(pDevInfo, x);

您需要使用QObject::connect将这些信号连接到另一端的实际接收器(槽)。请注意,发射信号比调用虚拟函数更耗费资源。


你的意思是说我不需要 IWifiCameraEnumerationCallback 接口来进行回调吗? - Vikram Ranabhatt
客户端程序如何实现这一点? - Vikram Ranabhatt
没有这样的要求,信号是一种鸭子类型接口(它们在运行时进行检查)。客户端创建一个Qt插槽并将您的信号连接到它。在更改代码以使用它们之前,您可能希望尝试和实验信号和插槽。 - Tamás Szelei

1

试试这个简单的例子

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(200, 120);

    QPushButton *quit = new QPushButton(tr("Quit"), this);
    quit->setGeometry(62, 40, 75, 30);
    quit->setFont(QFont("Times", 18, QFont::Bold));

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

你可以像这样使用

class IWifiCameraDiscovery
{      
 public slots:
    void UnInitialiseWiFiDiscovery();

 signals:
    void EnumerateWiFiDevice();
}

如果有任何进一步的细节,请询问。 - Santhosh
我知道这个例子,但我想知道如何针对我的情况使用信号和槽。 - Vikram Ranabhatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接