2013-11-26 5 views
0

Теперь я использую WMF для отображения реальной рамки камеры на Qt. Сначала можно получить рамку изображения в OnProcessSample, которая находится в моем классе Grabber, унаследованном от IMFSampleGrabberSinkCallback с WMF регулярно.WMF & Qt Не может получить сигнал в слоте от OnProcessSample

WMF.CPP

STDMETHODIMP Grabber::OnProcessSample 
(
REFGUID guidMajorMediaType, 
DWORD dwSampleFlags, 
LONGLONG llSampleTime, 
LONGLONG llSampleDuration, 
const BYTE * pSampleBuffer, 
DWORD dwSampleSize 
) 

{ 

    QMutexLocker locker(&m_SampleMutex); 

    pMySignal->setValue(); 

    return S_OK; 
} 

Для того, чтобы уведомить получение кадра UI, я попытался создать простые классы, унаследованные от QObject с Signal & слот, как в следующем.

mainwindow.h

class MySignal : public QObject 
{ 
    Q_OBJECT 

    public: 
     MySignal(QObject * parent = 0, char* name = 0) 
     { 
      setObjectName (name); 
     } 

     void setValue() { emit EnvokeSignal(); } 

public slots: 
     void ReceiveSignal(); 

signals: 
    void EnvokeSignal(); 
}; 

class MySignal2 : public QObject 
{ 
    Q_OBJECT 

    public: 
     MySignal2(QObject * parent = 0, char* name = 0) 
     { 
      setObjectName (name); 
     } 

     void setValue() { emit EnvokeSignal2(); } 

     public slots: 
     void ReceiveSignal2(); 

    signals: 
    void EnvokeSignal2(); 
}; 

mainwindow.cpp

MySignal* pMySignal; 

void MySignal::ReceiveSignal() 
{ 
    //qDebug()<<"Objectname = "<< objectName() <<" val = "<< v; 
    OutputDebugString(L" === ReceiveSignal === \n"); 
} 

void MySignal2::ReceiveSignal2() 
{ 
    //qDebug()<<"Objectname = "<< objectName() <<" val = "<< v; 
    OutputDebugString(L" === ReceiveSignal === \n"); 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    MySignal SignalSlotCleass(0, "a"); 
    MySignal2 Signal2SlotCleass(0, "b"); 


    pMySignal = &SignalSlotCleass; 

    QObject::connect(&SignalSlotCleass, &MySignal::EnvokeSignal, &Signal2SlotCleass, &MySignal2::ReceiveSignal2); 

    EnumerateCamDevice_StartupMF(); 
} 

Когда я использую только два класса, как MySignal1, MySignal2, я мог бы получить сообщение сигнала в методе Slot. Но если я попытался объединить WMF.cpp с функцией OnProcessSample, я не смог получить сообщение сигнала, отправленное из функции OnProcessSample в слот. Если кто-нибудь знает эту проблему, не могли бы вы дать мне несколько советов по ее преодолению?

ответ

0

После завершения функции on_pushButton_clicked() ваши объекты SignalSlotCleass и Signal2SlotCleass удаляются. Потому что он создан в стеке. Например, вы можете сделать это следующим образом:

SignalsHandler.h

class SignalsHandler 
{ 
public: 
    // if you want you can use any other smart pointer 
    // or even simple pointer but don`t forget clear memory 
    QSharedPointer<MySignal> pMySignal; 
    QSharedPointer<MySignal2> pMySignal2; 
public: 
    void SignalsHandler() : 
     pMySignal(new MySignal(0, "a")), 
     pMySignal(new MySignal2(0, "b")) 
    { 
     QObject::connect(pMySignal, &MySignal::EnvokeSignal, pMySignal2, &MySignal2::ReceiveSignal2); 
    } 
}; 

WMF.CPP

STDMETHODIMP Grabber::OnProcessSample 
(
REFGUID guidMajorMediaType, 
DWORD dwSampleFlags, 
LONGLONG llSampleTime, 
LONGLONG llSampleDuration, 
const BYTE * pSampleBuffer, 
DWORD dwSampleSize 
) 
{ 

    QMutexLocker locker(&m_SampleMutex); 

    // or you can pass hndl like a parameter of function 
    SignalsHandler hndl; 
    hndl.pMySignal->setValue(); 

    return S_OK; 
} 
+0

Я очень ценю свой комментарий. Это действительно полезно ~ Спасибо^__^ – MichaelH

+0

Рад это слышать =) – Guinness

 Смежные вопросы

  • Нет связанных вопросов^_^