C ++ Callback implementation using Qt Signal and Slot

I have created a library that has the following interface and callback. I wanted to Impress it with QT Signal and Slot.

Is it possible to replace IWifiCameraDiscovery with signal and slot

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;
 };

      

+3


source to share


2 answers


Yes, quite simple.

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();
};

      

In your implementation, instead of calling callbacks directly:

callback.onWiFiDeviceDiscovered(pDevInfo, x);

      



You would choose a signal:

emit onWiFiDeviceDiscovered(pDevInfo, x);

      

And you would use QObject::connect

to connect those signals to your actual receivers (slots) on the other end. Be aware that emitting a signal is more expensive than calling a virtual function.

+2


source


try this simple example

#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();
}

      



you can use this like

class IWifiCameraDiscovery
{      
 public slots:
    void UnInitialiseWiFiDiscovery();

 signals:
    void EnumerateWiFiDevice();
}

      

+1


source







All Articles