《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()
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()
相关文章推荐
- LeetCode 2015.7.15 27,20,19,14,232,118
- 循环-19. 币值转换(20)
- Effective C++条款18、19、20
- Java基础(19,20(1))IO流
- PAT_B_循环-19. 币值转换(20)
- 213中国跳棋(19)216(20)217(21)218(22)219(23)220(24)223(1)229(25)231(26)
- 现有杂乱无序的1-20二十个数,这二十个数为:1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5,20,试依次求出相邻四个数之和的最大和最小值
- 杭电OJ 2016 2014年9月25日20:19:15
- 循环-19. 币值转换(20)
- Extra Credits 19,20
- 第十周上机实践2.3 求1/2+2/3+3/4+......+19/20
- GradleUserGuide中文版 19)Plugins 20)插件规范 21)Java插件
- 19-20-预处理、编译、汇编、连接
- 背熟它,你的完形填空不对20也得对19! ! !
- 求1/2-2/3+3/4-…+19/20的和
- Hard way to learn python 笔记19-20
- 求1~19整数中,求出和为20的组合
- 19。。20之间的辗转
- 18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射
- 深入浅出设计模式(十二):18.职责链模式(Chain of Responsibility)19.状态模式(State)20.解释器模式(Interpreter)