2013-11-26 2 views
0

이제 WMF를 사용하여 Qt에서 실제 카메라 프레임을 표시합니다. 처음에는 WMF로 IMFSampleGrabberSinkCallback에서 상속 된 그래버 클래스에있는 OnProcessSample의 이미지 프레임을 얻는 것이 좋습니다.WMF 및 Qt OnProcessSample 슬롯에서 신호를 가져올 수 없습니다.

WMF.CPP는 UI에 프레임지고 통보하기 위해

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

저는 다음과 같은 신호 & 슬롯에서 QObject를 상속 간단한 클래스를 만들려고.

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 같은 두 클래스를 사용할 때, 나는 슬롯 방식의 신호 메시지를 얻을 수 있습니다. 하지만 WMF.cpp를 OnProcessSample 함수와 병합하려고하면 Slot 함수에서 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