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

在Qt程序中想打开一个网页,我们有这么几种方式。一是自己创建一个QWebView对象,然后用它打开,这时我们获得的是对页面的完全控制,不过我们自己要写许多代码。二是我们可以打开一个外部浏览器,例如在Symbian上打开其自带的S60浏览器,可以简单的这样写:

QDesktopServices::openUrl(QUrl(tr("http://wiki.forum.nokia.com/index.php/Qt_%E5%BC%80%E5%8F%91")));

或者使用QProcess:

QString browserProgram = "z://sys//bin//BrowserNG.exe";
QStringList url;
url << "4" << " http://wiki.forum.nokia.com/index.php/Qt_%E5%BC%80%E5%8F%91";
QProcess::startDetached(browserProgram, url);

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

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

加入头文件

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

#include <coemain.h>
#include <eikenv.h>
#include <e32base.h>
#include <e32cmn.h>
#include <e32des8.h>
#include <e32std.h>
#include <apgtask.h>
#include <apgcli.h>

 

加入库文件

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

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

 

给程序添加能力

我们需要给程序添加一些必要的能力,才能使其正常工作。使用本方法需要的能力都可以通过open signed online获得。

TARGET.CAPABILITY += ReadUserData WriteUserData UserEnvironment NetworkServices  /
ReadDeviceData WriteDeviceData ProtServ PowerMgmt /
SwEvent LocalServices

 

打开新页面的完整代码

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

#if defined(Q_WS_S60)
 
RApaLsSession apaLsSession;
const TUid KOSSBrowserUidValue =
{
0x10008D39
};
HBufC* param = HBufC::NewLC(64);
param->Des().Copy(_L("4 http://wiki.forum.nokia.com/index.php/Qt_%E5%BC%80%E5%8F%91")); //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);
 
#endif

 

测试设备

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章