您的位置:首页 > 编程语言 > C语言/C++

《C++.GUI.Programming.with.Qt.4》读书笔记Chapter 19~20

2008-04-26 10:14 393 查看
Chapter 19 Creating Plugins

Qt提供了Qlibrary类用于以一种平台无关的方式实现在程序运行时加载共享库。

Section 1 Extending Qt with Plugins

Qt本身可以被很多类型的plugin扩展,最常见的包括database drivers,image formats,text codecs等。

对于每种类型的plugin,通常都需要两个类:一个wrapper类实现该类通用的plugin API,以及一个或多个handler类,每个类实现一个plugin特定的API。

在plugin的.cpp文件中,需要使用Q_EXPORT_PLUGIN2()这个宏来确保plugin能够被Qt识别。

plugin真正执行的操作都是通过其handler来实现的。

plugin的.pro文件与应用程序不同。默认情况下,.pro文件使用app模板,然而这里必须使用lib模板,因为plugin属于库,而不是一个独立的应用程序。


QCoreApplication::addLibraryPath(),为程序的添加新的库路径。

Section 2. Making Application Plugin-Aware

应用程序的plugin实际是实现了一个或多个接口(interface)的动态库。应用程序与plugin之间的通讯是通过interface的virtual table来完成的。

一个接口(interface)通常声明一个virtual析构函数,一个返回QStringList的virtual函数,以及一个或多个其他virtual函数。

在接口声明的尾部,需要调用Q_DECLARE_INTREFACE()来将该interface与某个标识符关联起来。

QPluginLoader类用于在运行时加载plugin。
QPluginLoader::load(),加载plugin,通常无需显式调用,因为instance()函数会在必要时调用其完成加载。
QPluginLoader::instance(),返回一个指向plugin对象的QObject *指针。

同一个插件plugin被成功cast至多个interface,因为plugin可以通过多重继承来提供多个interface。

Section 3 Writing Application Plugins

应用程序的plugin是其要提供的interface和QObject二者的子类。

在plugin的原代码中,需要为其提供的每个Interface都要使用Q_INTERFACES()宏,来保证moc和qobject_cast<T>之间的协调工作。

在.cpp文件的尾部,同样需要调用Q_EXPORT_PLUGIN2()宏来使该plugin对于Qt可用。


Chapter 20 Platform-Specific Features

Section 1 Interfacing with Native APIs

在每个平台上,Qt都为QWidget提供了一个winId()函数,返回window ID或是句柄;QWidget还提供了一个静态函数find(),返回一个特定window ID对应的widget。我们可以将获得的window ID传递给Native API来执行平台特定的操作。

Qt定义了以下系统标志:Q_WS_WIN,Q_WS_X11,Q_WS_MAC,Q_WS_QWS(Qtopia)。

QSysInfo::WindowsVersion,QSysInfo::MacintoshVersion 这两个静态变量存储着WIN和MAC操作系统的版本信息

Section 2. Using ActiveX on Windows

ActiveX构建于Microst COM之上,它为使用组件的应用程序定义了一套接口,为提供组件的库和应用程序定义了另一套接口。

ActiveQt由两个模块组成:

QAxContainer模块允许用户使用COM object并在Qt程序中内嵌ActiveX控件。
QAxServer模块允许用户导出自定义的COM object以及用Qt编写的ActiveX控件。

Q_ENUMS()宏的作用是告知moc其"宏参数"是枚举类型。

QAxContainer模块由三个类组成:QAXObject封装一个COM object,QAxWidget封装一个ActiveX控件,QAxBase为QAxObject和QAxWidget实现核心COM功能。

QAxObject派生自QAxBase和QObject,QAxWidget派生自QAxBase和QWidget。

COM中的数据类型会被自动转换为合适的Qt数据类型。

QAxBase::setControl()

QObject::setProperty()可用于设置COM property和Qt property。

要链接QAxContainer库的话,需要在.pro文件中添加下列一行:"CONFIG +=qaxcontainer"

QAxBase::dynamicCall()

注意,QAxObject和QAxWidget的子类无法定义新的property,signal和slot。

QAxServer模块允许将一个标准Qt程序转换为一个ActiveX server。该server可以是共享库,也可以是独立的应用程序。共享库形式的server被称为in-process servers,而独立应用程序形式的server被称为out-of-process server。

QAxBindable在widget与ActiveX client之间提供了一个接口。

在Qt中处理多重继承中,如果基类中存在QObject的派生类,必须将这样的类放在首位。

QAXFACTORY_DEFAULT()宏的作用是导出一个AxtiveX控件,可以用于仅导出一个控件的ActiveX server;当server要导出多个控件时,不能使用QAXFACTORY_DEFAULT()宏。

QApplication能够识别命令行中的-activex参数,并使应用程序作为server而运行。

Q_CLASSINFO()宏

Section 3 Handling X11 Session Management

为了使一个Qt/X11应用程序意识到session manager的存在,需要重新实现QApplication::saveState()函数,并在该函数中保存应用程序的状态信息。

当用户启动shutdown操作时,程序员可以通过重新实现QApplication::commitData()来获取控制权,这允许应用程序保存未保存的数据,并且与用户交互,如果可能的话;这部分session management在X11和Windows上都被支持。

QObject::setObjectName()

void QApplicatoin::saveState(QSessionManager &),该函数在session manager希望应用程序保存其状态时被调用,QSessionManager类型的参数允许应用程序与session manager进行通讯。



discard command:是指session manager必须执行的用删除任何存储当前状态信息的命令。
restart command:是指session manager必须执行的用以重新启动应用程序的命令。

QSessionManager::setDiscardCommand(QStringList &)
QSessionManager::setDiscardCommand(QStringList &)

默认情况下,Qt提供的restart command的格式为: appname -session id_key

QSessionManager::release()
QSessionManager::cancel()

QApplication:isSessionRestored()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: