Qt操作Flash.doc_第1页
Qt操作Flash.doc_第2页
Qt操作Flash.doc_第3页
Qt操作Flash.doc_第4页
Qt操作Flash.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于QT与Flash互操作这几天在学习Action Script,在网上乱逛发现QT与flash互操作的可能性,试验了一把,居然成功了。首先是QT调用Flash中的函数:QT中有一个控件叫QAxWidget,加载一个.swf文件代码如下:QAxWidget flash(this,NULL); flash.setControl(QString:fromUtf8(d27cdb6e-ae6d-11cf-96b8-444553540000); flash.dynamicCall(LoadMovie(long,string),0,”E:/ First.swf ”); 现在是如何调用Flash中方法的问题,首先要用Flash中的ExternalInterface.addCall方法来添加与外界交互的接入点:ExternalInterface.addCallback(drawCircleExternal,drawCircle); 然后是如何在QT中调用这个函数,在我的AS3代码中,drawCircle需要一个int 型的参数,所以调用代码如下:QString str; QTextStream(&str) start()之后,mythread的run()函数中的代码会在新的线程(线程B)中执行.在run()函数中声明的变量实例化的对象,都属于线程B.但是mythread的所有代码,都还在存储在线程A中,只是run()函数的执行是在线程B中.在MDialog中,使用mythread-foo();foo()是在线程A中执行的.在MDialog中使用connect(this, SIGNAL(sigDialogSignal(), mythread, SLOT(slotThreadSlot();当emit sigDialogSignal()时,是会在MDialog所在的线程A中执行的.因为mythread与MDialog同属于一个线程, 这时thread可以看做一个普通类的实例.另外,因为connect函数的连接方式默认是自动连接,而对同属于一个纯种的两个对象,自动连接会使用直接连接,即slot在发出signal的线程中立即执行.例2:#include mthread.h #include MThread:MThread(QObject *parent) : QThread(parent) myTimer.start(1); connect(&myTimer, SIGNAL(timeout(), this, SLOT(slotPrint(); MThread:MThread() void MThread:run() for (int i = 0; i 100; +i) for (int j = 0 ; j 10000; +j) qDebug()-i; exec(); void MThread:slotPrint() qDebug()setInterval(100); connect(myTimer, SIGNAL(timeout(), this, SLOT(testFoo(), Qt:DirectConnection); QTimer:singleShot(0, myTimer,SLOT(start(); exec(); 以上这样写run(),myTimer在run()中new,即myTimer这个指针属于旧线程,但myTimer所指向的QTimer实例的实体在新的线程中,testFoo()会在新线程中执行.例3:void MThread:run() QTimer myTimer; mprint = new MPrint; myTimer.setInterval(100); connect(&myTimer, SIGNAL(timeout(), this, SLOT(testFoo(), Qt:DirectConnection); QTimer:singleShot(0, &myTimer,SLOT(start(); /testFoo(); exec(); 以上这样写run(),myTimer在run()中声明,即myTimer属于新的线程,testFoo()也会在新线程中执行.例4:class MThread : public QThread Q_OBJECT public: MThread(QObject *parent = 0); MThread(); void run(); MPrint *mprint; private: QTimer myTimer; private slots: void slotPrint(); void testFoo(); ; void MThread:run() mprint = new MPrint; myTimer.setInterval(100); connect(&myTimer, SIGNAL(timeout(), this, SLOT(testFoo(); QTimer:singleShot(0, &myTimer,SLOT(start(); /testFoo(); exec(); 以上这样写run(),testFoo()会在创建myTimer的老线程中执行.因为可以看到,mytimer和this(即mythread),都是在同一个线程中,只是在另一个线程中(run(),做了connect操作.要注意的是,在线程B中启动线程A中的一个定时器,不能使用myTimer.start(),这样启动不了定时器.而应使用signal来触发start()这个slot.POINT 5:slot不会中断同线程中的slot.例1:#include mthread.h #include MThread:MThread(QObject *parent) : QThread(parent) myTimer.start(1); connect(&myTimer, SIGNAL(timeout(), this, SLOT(slotPrint(); MThread:MThread() void MThread:run() exec(); void MThread:slotPrint() qDebug()=; for (int i = 0; i 100; +i) for (int j = 0 ; j 10000; +j) qDebug()-start()创建出的那个线程.例2:#include mthread.h #include MThread:MThread(QObject *parent) : QThread(parent) myTimer.start(1); connect(&myTimer, SIGNAL(timeout(), this, SLOT(slotPrint(); MThread:MThread() void MThread:run() testFoo(); exec(); void MThread:slotPrint() qDebug()=; void MThread:testFoo() for (int i = 0; i 100; +i) for (int j = 0 ; j 10000; +j) qDebug()-resize(1000,700); 2021flash-setControl(QString:fromUtf8(d27cdb6e-ae6d-11cf-96b8-444553540000); 2223QString name=qApp-applicationDirPath(); 2425flash-dynamicCall(LoadMovie(long,string),0,qApp-applicationDirPath()+/m.swf); 2627flash-show(); 2829return a.exec(); 3031在.prc中加入CONFIG+=qaxcontainer本人转自王广的博客,非常感谢 在QT中调用flash的函数,实现QT与flash的交互2009-12-09 19:15这个问题困扰我已久,而最近到了不得不解决的地步。因为这周的工作任务就是实现QT与Flash的交互。下午与师兄师弟在实验室搞了一下午,虽然有点头绪,但始终没有成功,回宿舍的路上一直在想这个问题,终于,当我在宿舍里吃完一碗泡面后,解决了这个问题,哇哈哈哈。下面贴一下具体的实现过程:首先我们看下C+与Flash的交互过程:# c+ to flash calls:TRY CString ret = m_FlashPlayer.CallFunction( empty ?); /AfxMessageBox(ret);CATCH(COleDispatchException, ex) TCHAR szCause255; CString strFormatted; ex-GetErrorMessage(szCause, 255); strFormatted = The program exited because of this error: ; strFormatted += szCause; AfxMessageBox(strFormatted);END_CATCHin Actionscrpt now :import flash.external.*;ExternalInterface.addCallback(FlashFunction, this, InternalFlashFunction);function InternalFlashFunction(str: String): String play(); return You can return a string.;flash to c+ calls:BEGIN_EVENTSINK_MAP(CFlashPlayerDlg, CDialog) /AFX_EVENTSINK_MAP(CFlashPlayerDlg) ON_EVENT(CFlashPlayerDlg, IDC_SHOCKWAVEFLASH1, 150 /* FSCommand */, OnFSCommand, VTS_BSTR VTS_BSTR) ON_EVENT(CFlashPlayerDlg, IDC_SHOCKWAVEFLASH1, 197 /* FlashCall */, OnFlashCall, VTS_BSTR) /AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CFlashPlayerDlg:OnFSCommand(LPCTSTR command, LPCTSTR args) AfxMessageBox(command);void CFlashPlayerDlg:OnFlashCall(LPCTSTR request) AfxMessageBox(request);in Actionscrpt :fscommand(ChangeText, textInput_txt.text); / for fscommand/ orflash.external.ExternalInterface.call(GetContacts); / flash callQT中QAxBase调用COM组件的函数是dynamicCall,我们先来看一下这个函数的定义:/*我是华丽的分割线*/QVariant QAxBase:dynamicCall ( const char * function, const QVariant & var1 = QVariant(), const QVariant & var2 = QVariant(), constQVariant & var3 = QVariant(), const QVariant & var4 = QVariant(), const QVariant & var5 = QVariant(), const QVariant & var6 = QVariant(), const QVariant & var7 = QVariant(), const QVariant & var8 = QVariant() )Calls the COM objects method function, passing the parameters var1, var1, var2, var3, var4, var5, var6, var7 and var8, and returns the value returned by the method, or an invalid QVariant if the method does not return a value or when the function call failed.If function is a method of the object the string must be provided as the full prototype, for example as it would be written in a QObject:connect() call./*我是华丽的分割线*/我们可以看到,dynamicCall中的各个参数的意思依次为,首先是COM组件中的函数名字以及参数类型,然后是各个函数的VALUE。在AS中,我们通过 ExternalInterface.addCallback 增加一个连接点,做为回调的入口,也就是dynamicCall中的函数。下面贴一段C+下调ActiveX的方法:as2 as3脚本增强了flash与外界的交互方式,以前的fscommand机制现在似乎相形见绌了。当然似乎只能flashplayer9以上支持。调用外界函数通过 ExternalInterface.call 外界调用as脚本通过 ExternalInterface.addCallback 增加一个连接点,回调as脚本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论