在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上的測試。不但可以啓動瀏覽器打開新頁面,而且在瀏覽器已經被佔用的情況下仍可打開新頁面。

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