【问题标题】:WMF & Qt Can not get the signal in slot from OnProcessSampleWMF & Qt 无法从 OnProcessSample 获取插槽中的信号
【发布时间】:2013-12-11 07:30:26
【问题描述】:

现在我正在使用 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 继承的简单类,如下所示。

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

【问题讨论】:

    标签: c++ qt signals-slots wmf


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的评论。真的很有帮助~谢谢^__^
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2012-09-11
    • 2020-10-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多