0

现在我正在使用 WMF 在 Qt 上显示真实的相机帧。首先,可以定期使用 WMF 从 IMFSampleGrabberSinkCallback 继承我的 Grabber 类中的 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 框架的获取,我尝试使用 Signal & Slot 创建从 QObject 继承的简单类,如下所示。

主窗口.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();
};

主窗口.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 方法中获取 Signal 消息。但是如果我尝试将 WMF.cpp 与 OnProcessSample 函数合并,我无法在 Slot 函数中获取从 OnProcessSample 发送的信号消息。如果有人知道这个问题,你能给我一些克服它的技巧吗?

4

1 回答 1

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;
}
于 2013-11-28T05:16:21.137 回答