c++ callback функция и label в QT

Есть callback функция, возвращающая изменения уровня громкости. Как вывести эти результаты в QLabel?
Код целиком.


#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>

#include <QDebug>


extern QString vol_prw;


void writeToSerial(QString, QString);

class CVolumeNotification : public IAudioEndpointVolumeCallback
{
    LONG m_RefCount;
    ~CVolumeNotification(void) {};
public:
    CVolumeNotification(void) : m_RefCount(1){}
    STDMETHODIMP_(ULONG)AddRef() { return InterlockedIncrement(&m_RefCount); }
    STDMETHODIMP_(ULONG)Release()
    {
        LONG ref = InterlockedDecrement(&m_RefCount);
        if (ref == 0)
            delete this;
        return ref;
    }
    STDMETHODIMP QueryInterface(REFIID IID, void** ReturnValue)
    {
        if (IID == IID_IUnknown || IID == __uuidof(IAudioEndpointVolumeCallback))
        {
            *ReturnValue = static_cast<IUnknown*>(this);
            AddRef();
            return S_OK;
        }
        *ReturnValue = NULL;
        return E_NOINTERFACE;
    }

    STDMETHODIMP OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA NotificationData)
    {
        QString vol = QString::number((NotificationData->fMasterVolume)*100);
        QString mute = QString::number(NotificationData->bMuted);

        if (vol != vol_prw)
        {
           vol_prw = vol;
           writeToSerial("vol", vol);
        }
        else
        {
            writeToSerial("mute", mute);
        }
        return S_OK;
    }
};

Здесь происходит магия


    STDMETHODIMP OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA NotificationData)
    {
        QString vol = QString::number((NotificationData->fMasterVolume)*100);
        QString mute = QString::number(NotificationData->bMuted);

        if (vol != vol_prw)
        {
           vol_prw = vol;
           writeToSerial("vol", vol);
        }
        else
        {
            writeToSerial("mute", mute);
        }
        return S_OK;
    }


Ответы (1 шт):

Автор решения: Sergey Tatarincev

Код не совсем чтобы весь конечно.. Видится несколько вариантов:

первый "хамский" - передавать в конструктор вашего класса ссылку на QLabel и использовать ее внутри класса:

class CVolumeNotification : public IAudioEndpointVolumeCallback
{
.....
private:
    QLabel* mylbl;
public:
    CVolumeNotification(QLabel* lbl){mylbl=lbl;}.....

Второй более правильный - наследовать класс и от IAudioEndpointVolumeCallback и от QObject, и пользоваться сигналами-слотами:

class CVolumeNotification : public IAudioEndpointVolumeCallback, public QObject
    {
    Q_OBJECT
    .....
    signals:
        mysignal(QString text);
    ....
    STDMETHODIMP OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA NotificationData){
       .....
       emit mysignal(QString("vol=%1, mute=%2").arg(vol).arg(mute));
    }
 

Теперь можете пользоваться сигналом в mainwindow:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
...
CVolumeNotification* n = new CVolumeNotification();
connect(n,SIGNAL(mysignal(QString)),this,SLOT(setLabelSlot(QString)));
}
void MainWindow::setLabelSlot(QString text){ui->label->setText(text);}
→ Ссылка