首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

怎么让外部纯C函数与Qt通信

2013-01-28 
如何让外部纯C函数与Qt通信需求我现在需要Qt接口让外部纯C函数调用。目的:C函数通知Qt更新数据。想法:提供一

如何让外部纯C函数与Qt通信
需求
我现在需要Qt接口让外部纯C函数调用。

目的:
C函数通知Qt更新数据。

想法:
提供一个Qt回调函数,作为接口。在接口中发送信号

问题 接口函数为一个全局函数,非类成员,如果让函数可以发送出信号。

我的做法:提供一个static 的成员接口 做emit signal
          问题是 static必须要传入一个object 才可以调用非static成员。

如果可以简单实现
外部纯C函数与Qt通信

[解决办法]
linux下可以用dbus封装Qt程序的接口,外部C程序通过远程调用这个dbus接口来实现Qt更新数据。
[解决办法]
居于LGPL的还真不知道,如果dbus不能用的话,可以试试socket,但是我也不知道socket是LGPL还是GPL的
[解决办法]
使用动态库导出一个接口
[解决办法]
这不等同于C调用C++ 接口?
[解决办法]
为什么不能用操作系统的信号呢?就象windows下的消息。
[解决办法]

引用:
为什么不能用操作系统的信号呢?就象windows下的消息。


其实用dbus很好解决,但是楼主好像不能用GPL的东东
[解决办法]
引用:
引用:这不等同于C调用C++ 接口?
问题在调用的接口处要抛出一个Qt的signal。如何定义一个与非类成员的signal?


楼主可以试试把要发出signal的类写成一个静态对象试试。
[解决办法]
widget.h
#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
#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();
}                                                                



main.cpp
#include    <QApplication>
#include    "widget.h"

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    Widget *w = Widget::Instance();
    w->show();

    app.exec();
    return 0;
}


用静态对象实现的,不知道LZ是不是说的这样的的功能
[解决办法]
说明一下,上面的这个demo:
在widget上有个button,点击button调用static函数,在static函数中,使widget发出create_label信号来创建一个新的QLabel
[解决办法]
那就自己用个enum呗


enum cases{A,B,C,D};
static fun(cases)
{
   switch(cases)
       case A:
           object_A;
           object_A_emit_signal;
           break;
       case B:
           object_B;
           object__B_emit_signal;
           break;
       ....
}


不一定要传递object指针吧,定义个enum,接收到什么enum参数就规定哪个object来发送信号
[解决办法]
这样有什么问题吗?
对象本身就是静态的,在指定对象的时候,先判断是否已经实例化,如果没有的话就new一个,如果已经实例化就返回这个对象。
保证整个程序只实例化一次静态对象,当这个对象的生存周期结束时,delete掉就OK了。
这个和普通static int i;有区别吗?只不过一个是integer,一个是对象罢了。
[解决办法]
楼主   怎么把QT中的数据传递给C函数呢
[解决办法]
就是用qt创建的一个表,怎么把表中的一个数据(例如:一个学号),传进C函数
[解决办法]
我记得文档里说dbus并没有支持多平台...可能是不支持windows吧。

发送一个系统的signal然后自己捕捉应该也可以,不一定要自己定义信号。

热点排行