在Qt程序中强制S60浏览器打开一个新页面
引言[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]
在需要打开新页面的源文件中加入下列头文件:
- include <coemain.h>
- include <eikenv.h>
- include <e32base.h>
- include <e32cmn.h>
- include <e32des8.h>
- include <e32std.h>
- include <apgtask.h>
- 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]
在需要打开页面的地方加入以下代码就可以了:
- 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);
- endif
测试设备[edit | edit source]
本代码已通过在N97和N8上的测试。不但可以启动浏览器打开新页面,而且在浏览器已经被占用的情况下仍可打开新页面。
相关文章[edit | edit source]
How to launch other applications in Qt