1 UIQ程序结构
UIQ程序是面向对象的,一个程序应至少有四个类:Application Class、Document Class、AppUI Class 和View Class。其继承关系如下图:
上图中绿颜色的类是UIQ应用程序开发者自己编写的类。QikAppUi, CQikDocument 和 CQikApplication是由Qikon提供。
各部分功能模块相互关系如下:
程序入口
à
ApplicationClass
à
DocumentClass
à
AppUiClass
à
ViewClass
1.2.2 UIQ应用程序入口
/**
E32Main()包含程序的起动代码,EXE执行入口。
E32Main() contains the program's start up code, the entry point for an EXE.
*/
GLDEF_C TInt E32Main()
{
return EikStart::RunApplication(NewApplication);
}
CApaApplication* NewApplication()
{
return new CHelloWorldApplication;
}
1.2.3 关于Application Model
当应用程序比较大、所要处理的数据比较多时,就会用到Application Model这个类。
Application Model主要是容纳应用程序中的数据。这种Model是用来分离UI Code和应用程序。这样的目的是,当更换UI时,就不需要改变处理数据的代码。
Application Model声明一般如下:
class CListBoxModel
: public CBase
{
public:
static CListBoxModel* NewL();
~CListBoxModel();
public:
/*
成员声明
*/
private:
/*
成员声明
*/
};
Application Model
与其它类有如下几个主要关联:
Ø
应用程序中DocumentClass类构造拥有这个Model;
Ø
AppUi类中包含有一个指向该Model的指针或Model的引用;
Ø
AppUI接受由ViewClass传递过来的用户命令,并调用适当的Model中的函数来处理用户命令。
Ø
Views(in the GUI framework sense)也包含Model的指针或引用。Views调用Model中合适的成员函数来处理用户命令。Views也能决定传递给AppUI的用户命令。
1.3 构造四个主要类
1.3.1 构造Application Class
UIQ应用程序中的Application都是继承于CQikApplication这个类,并且要重载CQikApplication类中的两个纯虚函数:
- CQikApplication::AppDllUid()
- CQikApplication::CreateDocumentL()
AppDllUid()函数由应用程序构架来调用,验证个应用程序的身份。这个函数执行后返回应用程序的UIQ。
CreateDocumentL()也是由应用程序来调用的,用来创建和程序相关的文档对象。执行这个函数后,应返回指向本应用程序中Document类的指针,如下:
class CExampleApplication : public CQikApplication
{
private:
//CreateDocumentL calls for NewL in CExampleDocument
CApaDocument* CreateDocumentL();
//Returns the Uid of the application.
TUid AppDllUid() const;
};
// 1. Gets the application UID
TUid CExampleApplication::AppDllUid() const
{
return KUidApp; // The same UID as is declared in the mmp file.
}
// 2. Gets a new document object.
CApaDocument* CExampleApplication::CreateDocumentL()
{
return new (ELeave) CExampleDocument(*this);
}
1.3.2 构造Document Class
class CExampleDocument : public CQikDocument
{
public:
// Constructor.
CExampleDocument(CEikApplication& aApp);
private: // From CEikDocument.
CEikAppUi* CreateAppUiL();
};
// 1. Document constructor.
CExampleDocument::CExampleDocument(CEikApplication& aApp) : CQikDocument(aApp)
{
}
// 2. Create appUI.
CEikAppUi* CExampleDocument::CreateAppUiL()
{
return new (ELeave) CExampleAppUi;
}
1.3.3 构造AppUi Class
class CExampleAppUi : public CQikAppUi
{
public:
// Second-phase constructor.
void ConstructL();
private:
CExampleAppView* iAppView;
};
一般要在
AppUI
类中的
ConstructL()
函数中创建
View
对象,如下:
void CMyDirectoryAppUi::ConstructL()
{
//Create the ListView and attach it.
//This will become the default view since we are adding it first
CExampleAppView* iListView = CExampleApptView::NewLC(*this, KNullViewId, Model);
AddViewL(*iListView);
CleanupStack::Pop(iListView);
}
1.3.4 构造View Class
class CExampleView : public CQikViewBase
{
private:
void ConstructL();
protected:
TVwsViewId ViewId()const;
void ViewContructL();
};
1.3.5 构造ModelClass
class CListBoxModel
: public CBase
{
public:
static CListBoxModel* NewL();
~CListBoxModel();
public:
/*
成员声明
*/
private:
/*
成员声明
*/
};