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