QT和flex swf进行相互调用和交互

 

  1. 在项目文件xxxx.pro中加入 CONFIG += qaxcontainer
  2. 在窗口中使用如下代码,嵌入并播放flash
    //中文编码设置 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); // QString applicationPath =QCoreApplication::applicationDirPath(); swf = new QAxWidget(0,0); //这个show的方法要放在这里,否则会产生初始化swf的时候,大小有问题的情况 swf->show(); // swf->setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}")); swf->dynamicCall("LoadMovie(int,QString)",0,applicationPath+"/Resources/Main.swf"); swf->dynamicCall("Play");  
  • 让QT的程序调用swf中的方法:
  • 在qt的主窗口中定义一个按钮。按钮的click事件如下:
  • void MainWindow::on_pushButton_clicked() { //QMessageBox::warning(NULL, "warning","on click", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); QString funName="callWithEXE"; QString arg = QObject::tr("哦哟!我是QT传给flex的内容"); QString callMethod ="<invoke name=/"" + funName + "/" returntype=/"xml/"><arguments><string>" + arg + "</string></arguments></invoke>"; swf->dynamicCall("CallFunction(string)",callMethod); } 
  • 在flex的as文件中定义接口程序如下:
    private function init():void{ //这是外部接口,让C#可以调用 ExternalInterface.addCallback("callWithEXE",callWithEXE); }  
  • 在flex的as文件中定义程序的实现方法
    public function callWithEXE(str:String):void{ Alert.show(str,"内容显示的是"); }
  • 上面的代码段,完成了如此场景:在qt的主窗口有个按钮,点击按钮后,在flex里面显示出一个alert窗口,内容为:哦哟,我是QT传递给flex的内容
  • 让swf中调用QT中的方法:
    • 在flex中定义一个按钮。访问QT中的方法,并获得一个返回值
      protected function button1_clickHandler(event:MouseEvent):void { // TODO Auto-generated method stub if( ExternalInterface.available){ //Alert.show("ExternalInterface 可用。可以调用外壳方法") //调用外部程序SayHello方法,并传入方法参数"Hunk",输出方法返回值result var strReturn:String = ExternalInterface.call("SayHello", "Hunk","roamer"); Alert.show(strReturn); }else{ Alert.show("ExternalInterface 不可用。") } }  
    • 在QT中定义一个slot,和来自flex中的方法产生signal进行连接。由于as3运行时候,在flex中的ExternalInterface.call会产生一个signal,形式是FlashCall( QString ),其中QString是flex方法里面传来的参数"Hunk","roamer".
    • 定义一个slot,在头文件中定义。
      public slots:void SayHello(QString message);  
    • 在QT的代码中连接一个slot
      //链接一个槽,使得swf中调用后,使用这个槽 connect(swf,SIGNAL(FlashCall(QString)),this,SLOT(SayHello(const QString&)));
    • 实现slot中的方法
      void MainWindow::SayHello(QString message) { QMessageBox::warning(NULL,QObject::tr( "我是swf传递过来的内容"),message, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); QString rtnString =QObject::tr("<string>哦也!我是qt返回的内容</string>"); swf->dynamicCall("SetReturnValue(string)",rtnString); }

      注意:flex中传递过来的内容是一个包含方法名和参数列表的xml。同样:如果要让QT给flex代码返回值。返回值也必须是xml字符串( "<string>哦也!我是qt返回的内容</string>" ; )。否则不能获得

你可能感兴趣的:(String,function,Flex,qt,button,Signal)