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

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()
    

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值