在Qt程序中强制S60浏览器打开一个新页面

From Qt Wiki
Jump to navigation Jump to search

Template:ArticleMetaData

引言[edit | edit source]

在Qt程序中想打开一个网页,我们有这么几种方式。一是自己创建一个QWebView对象,然后用它打开,这时我们获得的是对页面的完全控制,不过我们自己要写许多代码。二是我们可以打开一个外部浏览器,例如在Symbian上打开其自带的S60浏览器,可以简单的这样写:
QDesktopServices::openUrl(QUrl(tr("Qt 开发"))); 或者使用QProcess:
QString browserProgram = "z:\\sys\\bin\\BrowserNG.exe"; QStringList url; url << "4" << " Qt 开发"; QProcess::startDetached(browserProgram, url);

但是使用后两种方式是无法完全控制程序外部Symbian自带的这个浏览器的,例如如果该浏览器已经被打开,则上述代码的操作是失败的,即网页不会在浏览器中被打开。

于是我们就可以通过本文介绍的方法,通过直接使用Symbian代码,不但可以启动浏览器打开新页面,而且在浏览器已经被占用的情况下仍可打开新页面。

加入头文件[edit | edit source]

在需要打开新页面的源文件中加入下列头文件:

  1. include <coemain.h>
  2. include <eikenv.h>
  3. include <e32base.h>
  4. include <e32cmn.h>
  5. include <e32des8.h>
  6. include <e32std.h>
  7. include <apgtask.h>
  8. include <apgcli.h>


加入库文件[edit | edit source]

在pro文件中为Symbian添加下列库:

   LIBS += -lcone \
       -leuser \
       -lapgrfx \
       -leikcore


给程序添加能力[edit | edit source]

我们需要给程序添加一些必要的能力,才能使其正常工作。使用本方法需要的能力都可以通过open signed online获得。 TARGET.CAPABILITY += ReadUserData WriteUserData UserEnvironment NetworkServices \

                    ReadDeviceData WriteDeviceData ProtServ PowerMgmt  \
                    SwEvent LocalServices 


打开新页面的完整代码[edit | edit source]

在需要打开页面的地方加入以下代码就可以了:

  1. if defined(Q_WS_S60)

RApaLsSession apaLsSession; const TUid KOSSBrowserUidValue = { 0x10008D39 }; HBufC* param = HBufC::NewLC(64); param->Des().Copy(_L("4 Qt 开发")); //change the url to what you want to open. parameter = “4” + ”<Space>“ + ”<Url>” TUid id(KOSSBrowserUidValue); TApaTaskList taskList(CEikonEnv::Static()->WsSession()); TApaTask task = taskList.FindApp(id); if(task.Exists()) { task.BringToForeground(); HBufC8* param8 = HBufC8::NewLC(param->Length()); param8->Des().Append(*param); task.SendMessage(TUid::Uid(0), *param8); // UID not used CleanupStack::PopAndDestroy(param8); } else { if(!apaLsSession.Handle()) { User::LeaveIfError(apaLsSession.Connect()); CleanupClosePushL( apaLsSession ); // added this } TThreadId thread; User::LeaveIfError(apaLsSession.StartDocument(*param, KOSSBrowserUidValue, thread)); CleanupStack::PopAndDestroy(); // apaLsSession } CleanupStack::PopAndDestroy( param);

  1. endif


测试设备[edit | edit source]

本代码已通过在N97和N8上的测试。不但可以启动浏览器打开新页面,而且在浏览器已经被占用的情况下仍可打开新页面。


相关文章[edit | edit source]

How to launch other applications in Qt

相关链接[edit | edit source]