关于SDK回调Qt函数的问题

118 篇文章 2 订阅
28 篇文章 0 订阅

1、问题:

        最近遇到纯C、c++回调Qt的函数问题,并且在Qt的线程里注册,第一次看见这样用,貌似问题不大,但是也有值得怀疑和不稳定的地方。但是暂时还不能断言这种使用方法有问题,写出来作为经验总结,也供大家互相学习和讨论。


        值得注意的是,在线程注册回调函数的时候传的参数是函数体。


2、相关帖子和博文:

如何让外部纯C函数与Qt通信

http://bbs.csdn.net/topics/390278368?page=1


我现在的办法是提供一个callback函数和一个文件域的void* 指针
callback()
{
    b::up(void* pt)// static;
}
在 b::static void up(void* pt)
{
     b * pt_ = (b *) pt;
     emit pt_->signal();
}

---------------------------------------------------------------------------------------

widget.h

C/C++ code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef WIDGET_H
#define WIDGET_H
 
#include    <QtGui>
#include    <QtCore>
 
class  Widget :  public  QWidget
{
     Q_OBJECT
public :
     Widget();
     static  Widget *Instance();
     static  Widget *widget;
     void  emit_signal();
 
public  slots:
     void  create();
     void  use_fun();
 
signals:
     void  create_label();
 
};
#endif


widget.cpp
C/C++ code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include    "widget.h"
 
static  void  show_new_label()
{
     qDebug() <<  "in static fun\n" ;
     Widget *w = Widget::Instance();
     w->emit_signal();
     //return;
}
 
Widget::Widget()
{
     QPushButton *button =  new  QPushButton( "button" , this );
     connect(button, SIGNAL(clicked()),  this , SLOT(use_fun()));
 
     connect( this , SIGNAL(create_label()),  this , SLOT(create()));
     resize(400,400);
}
 
Widget *Widget::widget = NULL;
Widget *Widget::Instance()
{
     if (widget == NULL)
     {
         widget =  new  Widget;
     }
     return  widget;
}
 
void  Widget::emit_signal()
{
     qDebug() <<  "emit signal" ;
     emit create_label();
}
 
void  Widget::use_fun()
{
     show_new_label();
}
 
void  Widget::create()
{
     QLabel *label =  new  QLabel( this );
     label->setText( "this is a new label" );
     label->resize(100,100);
     label->move(100,100);
     label->show();
}     

Qt中调用相机的回调函数通常需要使用相机厂商提供的SDK,并按照其API进行编程。以下是一个简单的示例代码,假设使用的是Basler相机: ```cpp // Camera.h #include <pylon/PylonIncludes.h> #include <QObject> #include <QImage> class Camera : public QObject { Q_OBJECT public: Camera(QObject *parent = nullptr); ~Camera(); void start(); signals: void frameReady(QImage frame); private: void onFrameGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult); private: Pylon::CInstantCamera m_camera; }; // Camera.cpp Camera::Camera(QObject *parent) : QObject(parent) { Pylon::PylonInitialize(); m_camera.Attach(Pylon::CTlFactory::GetInstance().CreateFirstDevice()); } Camera::~Camera() { m_camera.StopGrabbing(); Pylon::PylonTerminate(); } void Camera::start() { m_camera.StartGrabbing(Pylon::GrabStrategy_LatestImageOnly, Pylon::Cleanup_Delete); Pylon::CImageFormatConverter formatConverter; formatConverter.OutputPixelFormat = Pylon::PixelType_RGB8packed; while (m_camera.IsGrabbing()) { Pylon::CGrabResultPtr grabResult; m_camera.RetrieveResult(5000, grabResult, Pylon::TimeoutHandling_ThrowException); if (grabResult.IsValid()) { Pylon::CPylonImage pylonImage; formatConverter.Convert(pylonImage, grabResult); QImage image(pylonImage.GetBuffer(), pylonImage.GetWidth(), pylonImage.GetHeight(), QImage::Format_RGB888); emit frameReady(image); } } } void Camera::onFrameGrabbed(Pylon::CInstantCamera& camera, const Pylon::CGrabResultPtr& grabResult) { // 处理相机数据并发送信号 } ``` 在这个示例中,我们使用了Pylon的SDK来调用相机的回调函数。在Camera类中,我们将相机数据转换为QImage,并通过信号/槽机制将数据传递给主线程。在主线程中,我们可以将相机数据显示在控件中,例如通过QLabel或QGraphicsView等类。 需要注意的是,不同的相机厂商可能有不同的SDK,使用方法也可能不同。因此,在编程之前,需要仔细阅读相机厂商提供的API文档,并按照其要求进行编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值