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

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


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

flash and gif 的播放


1 #include <QtGui> 2 #include <QtGui/QApplication> 3 #include <QTextCodec>  4 #include <QWidget> 5 #include <ActiveQt/QAxWidget> 6 #include <QTime> 7  8 void gifplay(QLabel *label) 9 {10     label->show();11 }12 13 void gifclose(QLabel *label)14 {15     label->close();16 }17 18 void flashplay(QAxWidget *flash)19 {20     flash->show();21 }22 23 void flashclose(QAxWidget *flash)24 {25     flash->close();26 }27 28 int main(int argc, char *argv[])29 {30     QApplication a(argc, argv);31 32     QTextCodec *codec = QTextCodec::codecForName("GB2312"); //文本为GB2312编码33     QTextCodec::setCodecForLocale(codec);       //设置本地编码34     QTextCodec::setCodecForCStrings(codec);     //设置字符串编码35     QTextCodec::setCodecForTr(codec);36 37     QAxWidget *flash = new QAxWidget(0,0);      //QAxWidget使用的是ActiveX插件38     flash->resize(800,600);                    //设置该控件的初始大小39     flash->setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}")); //设定控制器40     flash->dynamicCall("LoadMovie(long,string)",0,"D:\\flash1.swf");   //41     flash->setWindowFlags(Qt::FramelessWindowHint);   //去除边框42     flashplay(flash);43     QTime t;44     t.start();45     while(t.elapsed()<5000)46     {47         QApplication::processEvents();48     }49     flashclose(flash);50 51     /*52     QMovie *movie;  53     movie = new QMovie("D:\\gif1.gif");  54     QLabel *label=new QLabel ("", 0);55     label->setGeometry( 300, 300, 500, 500 );  56     label->setMovie(movie);  57     label->setScaledContents(true);  58     movie->start();  59     gifplay(label);60     t.start();61     while(t.elapsed()<5000)62     {63         QApplication::processEvents();64     }65     gifclose(label);  66     */67 68     return a.exec();69 }


0 0
原创粉丝点击