• 5869阅读
  • 9回复

[讨论]qt 回调函数问题 [复制链接]

上一主题 下一主题
离线guanjiangjie
 
只看楼主 倒序阅读 楼主  发表于: 2013-04-01
int CtiBoardEventCb(WORD wEvent,int nReference,WORD dwParam)
{
    WORD newS;
    switch(wEvent)
    {
    case EVT_CHSTAT_CHG:
        newS = (WORD)(dwParam & 0xffff);
        pState->nCh = nReference;
        switch(newS)
        {
        case 1: break;
        case CH_STATE_FREE:break;
        case CH_STATE_PICKUPED:qDebug()<<pState->nCh<<"  PICKEDUP"<<endl;break;
        case CH_STATE_ALERTING:qDebug()<<pState->nCh<<"  ALERTING"<<endl;break;
        case CH_STATE_RINGBACK:qDebug()<<pState->nCh<<"  RINGBACK"<<endl;break;
        case CH_STATE_CALLOUT:qDebug()<<pState->nCh<<"  CALLOUT"<<endl;break;
        case CH_STATE_CONNECT:qDebug()<<pState->nCh<<"  CONNECT"<<endl;break;
        case CH_STATE_WAITHUNGUP:qDebug()<<pState->nCh<<"  WAITHUNGUP"<<endl;break;
        default:
            break;
        }
    default:
        break;
    }
    pState->State = newS;
    return 0;
}

这是一个回调函数,我想达到的一个目的就是在回调函数的case语句中,去控制ui中的控件(上面qDebug的语句就是我要在控件内加入的信息,我现在只能打印在下面,不能打印在控件中),比如edit之类的,但是这个函数有又不是在这个mainwindow这个类中,不能直接去控制ui内的控件,我该如何去解决这个问题!请大神指导啊!
离线jdwx

只看该作者 1楼 发表于: 2013-04-01
回 楼主(guanjiangjie) 的帖子
最简单也是最不好的办法,用一个mainwindow的全局变量。
反正想办法得到mainwindow的指针,之后就可以操作了。

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线guanjiangjie
只看该作者 2楼 发表于: 2013-04-01
Re:回 楼主(guanjiangjie) 的帖子
引用第1楼jdwx于2013-04-01 09:19发表的 回 楼主(guanjiangjie) 的帖子 :
最简单也是最不好的办法,用一个mainwindow的全局变量。
反正想办法得到mainwindow的指针,之后就可以操作了。



能教我怎么写么?我是新手,对mainwindow一直搞不懂。。。在哪里定义,怎么定义?


离线guanjiangjie
只看该作者 3楼 发表于: 2013-04-01
有没有人能够帮我呀,感谢大家了啊!
离线呆呆很呆
只看该作者 4楼 发表于: 2013-04-01
办法到有很多
1.全局变量+extern
2.继承QApplication 设置mainwindow成员变量 需要的时候将qApp static_cast成你的Application
3.mainwindow 设置objectName 然后QApplication::allWidgets 遍历 确定后static_cast
4.QApplication::allWidgets 遍历 用qobject_cast 判断
5.同上用MOC生成的信息判断类名
6. 。。。。。。。
离线guanjiangjie
只看该作者 5楼 发表于: 2013-04-01
引用第4楼呆呆很呆于2013-04-01 13:33发表的  :
办法到有很多
1.全局变量+extern
2.继承QApplication 设置mainwindow成员变量 需要的时候将qApp static_cast成你的Application
3.mainwindow 设置objectName 然后QApplication::allWidgets 遍历 确定后static_cast
4.QApplication::allWidgets 遍历 用qobject_cast 判断
.......

你好,我就是不知道怎么用,你能写点例子给我看下么?谢谢!
离线cai6811376

只看该作者 6楼 发表于: 2013-04-01
定义一个回调函数类,把这个函数设为纯虚函数,让mainwindow继承这个类,然后实现这个函数的功能,把这个mainwindow的地址传入调用回调函数的类中,用这个传入的地址调用回调函数,会自动绑定到mainwindow上
离线guanjiangjie
只看该作者 7楼 发表于: 2013-04-02
希望能够给点实例,我刚开始学,对里面的概念不是很熟悉。。。有点朦胧!
离线呆呆很呆
只看该作者 8楼 发表于: 2013-04-02
选qobject_cast 给你说一下把
  1. #include <QApplication>
  2. #include <QMainWindow>
  3. int CtiBoardEventCb(WORD wEvent,int nReference,WORD dwParam)
  4. {
  5. QMainWindow *mainWindow = 0;
  6. foreach(QWidget *widget,QApplication::allWidgets())if(mainWindow = qobject_cast<QMainWindow *>(widget))break; //一定是"=" 而不是"=="
  7. if(!mainWindow){/*没有找到*/qDebug()<<"Can't find mainWIndow!!";return -1;}
  8. //现在mainWindow就是你要找的
  9. //....
  10. }

手头没编译器 如果有忘了分号什么的你就自己改吧.....
离线huanter

只看该作者 9楼 发表于: 2013-12-10
我也就同样的问题卡在这!LZ解决了吗?
快速回复
限100 字节
 
上一个 下一个