QT4 使用

以前使用QT4时的一些记录, 以没有整理,大家凑合看吧, 对新手还是有帮助的.

                                              http://blog.csdn.net/aero_boy 老牛

 

----------------

QT4的新特性

        新技术:

            Tulip:   一组新的模板类容器及算法,QList, QVector, QStack, QQueue, QMap, QHash,

                    QSet等,新的迭代器,相比STL具有良好的使用语法, 空容器不占用内存, 支持在线程问安全

                    的复制容器.

            Interview:  一组model/view架构的控件,提供一个通用的方法来分离显示视图和控制部

                    分.QStandardItemModel, QDirModel, QStringListModel等.

            Arthur: 新的绘图系统(QPainter族), QPainter执行绘制操作, QPaintDevice描述了一个设备能否

                    为QPainter提供绘制支持, QPaintEngine为QPainter在不同的设备上绘制提供统一的接口,

                    QPaintEngine只由QPainter和QPaintDevice内使用, 当前的QT支持在下列平台上绘制(位

                    图方式; OpenGL; PostScritpt(Linux,unix, Mac); QuickDraw,CoreGraphics(MAC);

                    X11,X Render(linux,unix));

                    要支持新的设备,你只需要从QPaintEngine派生并实现相应的虚函数.

                    QT绘图的新特性, Gradient Brushes(可变角度画笔); Alpha-Blended(Alpha通道混合

                        (QColor中指定);QGLWidget部件(能使用OpenGL绘图); Anti-Aliased Edges(反走样

                        边缘,XRender除外); Painter Paths(路径绘制); Widget Double-Buffering(双缓冲默

                        认支持,可能单独关闭);Pen and Brush Transformation(完善中); Custom Filled Pens;

                         QImage像素化的绘制设备(平台无关);SVG Rendering

            Scribe:          重新设计的文字渲染和布局系统; 为文本编辑提供更加方便的接口.

            Mainwindow:  应该程序主窗口,包括了工具栏,菜单, 窗口停靠等.

            New Qt Designer: 新的界面设计器.

            QtScript:        在应用程序中支持脚本功能.

            D-Bus:           IPC和RPC支持.

            QtNetwork:    网络支持模块.

            QtSql:           数据库支持模块

            QtXml:          Xml支持模块.

            QtTest:        自动测试工具

            QtWebKit:     支持QT API的浏览器引擎.

            Concurrent:   集成的多线程支持.

 

        其它:

             部件名字: QT虽然承诺Widget的名字会很重要,但从V1版到现在似乎都没有实现. 

             类型转换: QT4 提供了qobject_cast<>() 支持QObject子类间的安全的类型转换, 不同于C++

                    的dynamic_cast的是,它可工作在RTTI禁止时,和穿越DLL边界安全工作.

             智能指针: 针对QObject子类的智能指针(QPointer<T>).

 

编译QT

        QT默认是不定义wchar_t类型的, 在VC中编译时, 可修改mkspecs/win32-msvcXXXX目录下的编译配置文件qmake.conf.  为QMAKE_CFLAGS配置项添加或修改-Zc:wchar_t  ;否则会出现Qt4中采用了  wchar_t的函数不能够接受没有-Zc:wchar_t选项下的wchar_t类型,  程序连接时会有QString下的一些函数不能连接的问题.

 

Meta-Object,信号和槽

        Qt成功能一个主要的方面就是对 C++的扩展, 使之能把彼此独立的软件模块连接起来,而不需要模块间

    的任何细节。这就是元对象模型(Meta-Objecct Model)系统, 它提供了两个关键的特性: 信号/槽和内省

    (introspection), 内省功能允许程序在运行时能得到QObject子类的元信息(meta-information), 其中包

    含了全部信号和槽列表, 类名字,属性, 内容相关的文本翻译支持, 它以是构成QSA的基础.

        这个机制的工作过程如下:

          ● Q_OBJECT声明了一些QObject子类必须实现的内省函数:metaObject(),TR(),qt_metacall()等

          ●  Qt的moc工具实现Q_OBJECT宏声明的函数和所有的信号.

          ●  QObject成员函数connect()和disconnect()使用这些内省函数实现信号和槽的连接.

        一个信号可以连接多个槽,担调用顺序是随机的; 多个信号可以连接到一个槽;一个信号可以连接到另一

    个信号,第一个信号发出后,第二个信号也同时发送; 连接可以被删除; 连接的信号和槽必须有相同的参数

    类型才能成功连接,如果信号里的参数多于槽的参数,多余的被忽略; 

            纯粹的信号函数,可以不用实现,只有定义就行了.

 

        对象树:QObjects将它们自己组织为一个对象树,一个对象被销毁时,它会自动销毁它的所有了对象,并将自己父对象的children()列表中移除。我们只需要记住的是如果创建了一个没有父对象的对象时,必须自己销毁它们。可以使用QOjbect::dumpObjectTree(),QObject::dumpObjectInfo()来观察程序的对象树。

        对象的构造/销毁顺序:在对象创建在堆中时(使用new),它们可能以任意的顺序构造和销毁;当对象创建在栈中时,根据C++标准,它们以创建时相反的顺序销毁。来考虑如下的代码:

int main() {

      QPushButton quit("Quit");

      QWidget window;

      quit.setParent(&window);

      ...

}

这时当父对象window销毁时,他会同时销毁他的所有子对象,在这里是quit, 在window对象被销毁后,系统会继续销毁下一个在栈中的对象quit, 可是它已经被销毁了,所以为引起问题,如果把两个对象的创建顺序调换一下,就没问题了。

 

QT发布

        在发布应用程序时,可以选择是将QT库发布到系统目录(多个QT应用共享一个库,节约内存),还是应用程序目录(多个QT版本库并存):

        Mac OS的应用程序发布(deployment-mac.html):

               1) 使用otool查看程序依赖那些库;

                    拷贝依赖的Frameworks到应用束中,XXX.app/Contents/Frameworks中.

                2) 使用install_name_tool改变库的依赖路径

                        设置库的ID:

                            install_name_tool -id newID   old-name-ID

                                                             |           /__ 应用程序或使用中记录的库ID名称

                                                              /__被使用库的新名称ID

                        改变应用程序及库中记录的动态链接的库ID:

                            install_name_tool -change old-name-ID  newId  程序或库名

                                                                    |               |        /__ 要修改引用的程序或库

                                                                    |                /_ 在上一步中设定的被使用库的新ID

                                                                    /_ 应用程序或使用中记录的库ID名称

 

                    在ID名中可以使用@executable_path加载器(dyld)的特殊变量来表示程序运行时的路径,如@executable_path/./libname 表示依赖当前目录

               对于有插件的应用, 对插件库的操作和上面的类式:

                    拷贝插件目录到XXX.app/Contents下;

                    使用install_name_tool改变插件库的路径ID;

                    使用install_name_tool改变应用程序中记录的插件库的ID.

 

QT资源系统

        QT资源系统使用一个跨平台的方案将程序需要用的一些文件以二进制的形式存入可执行文件中. 

        使用qmake, rcc 根据资源文件(.qrc)生成.

        资源文件(.qrc):  一个xml格式的描述文件, 记录了程序使用的各种资源的信息. 基本格式:

               <RCC>

                    <qresource prefix="资源前缀名-1" lang="zh_TW" >

                        <file>qt43-class-chart[1].pdf</file>

                        <file>ppp/Touchpad.txt</file>

                    </qresource>

                    <qresource lang="zh_CN" >

                        <file alias="qt-class.pdf">qt43-class-chart[1].pdf</file>

                    </qresource>

               </RCC>

              说明: 一个RCC节点下可以有一到多个qresource资源描述节点, 每个qresource节点有前

                      缀名和语言两个可选属性, 在qresource下可以包含若干个file, 每个file对应一个实

                     际的文件. 还可以为每个alias指定一个别名.在file中指定的文件路径必须以.prc文件

                     所在的位置为基准的相对路径中.

              在程序中使用资源名字访问资源, 访问名为 :[/前缀名]</<别名|路径名>>

              QT会首先根据QLocale::system().name()的名字查找对应语言分节中的资源, 如果没有

              在到默认分节中找.

        编译资源到程序中: 只需要在程序的.pro文件中指定资源文件的名字:

                    RESOURCES = application.qrc

             qmake就会生成一个名qrc_application.cpp的C++程序文件, 将所在的资源以二进制数组

             的形式包含到程序中.

        程序外部的二进制资源(.rcc): 使用rcc工具可以将所有的资源编译到一个.rcc文件中:

                  rcc -binary myresource.qrc -o myresource.rcc

             这样就能在程序中动态地使用QResource API来注册并使用资源, 如:

                  QResource::registerResource("/path/to/myresource.rcc");

        在程序中使用资源文件:  在程序中可以使用资源访问名来代替普通的文件路径, 使用方式是一

            样的,  如:QIcon(":/images/cut.png");

            在内存中所有的资源被组织成一棵资源树, 你可以使用QDir和QFile来访问, 在QDir中用":/"表

            示树的根.  

            如果资源是在一个静态库中, 需要使用Q_INIT_RESOURCE()显示初始化, 不在使用时, 以必

            须使用Q_CLEANUP_RESOURCE()卸载.       

 

Qt Designer

        QT 4的Designer是不同于QT3的全新开发版. 具有全新的操作界面, 可视化和能用鼠标拖动操作的

信号/槽连接设置.可以在多个窗口之间自由的拖动控件,而保持控件的属性设置.

        动态属性: 从QT4.2开始,在QObject中增加了运行时的动态属性设置, 可以通过setProperty()

                和property()来设置一个名/值对的动态属性值.在Qt Designer中可以在属性编辑器工具条

                上的"+"按钮操作.

        QFormLayout: 从Qt 4.4开始, 新增了一个QFormLayout布局类, 它将控件按固定的两列来布局, 

                左边列为Label控件, 右边列为其它控件.

        设置样式表(Style Sheets): 在From背景上点右键, 在弹出菜单中选择"改变样式表...", 会显示一个

                设置窗口.详见stylesheet.html

        Main Windows: 使用 Main Window模板窗口, 可以很方便的使用菜单,工具栏, 粘附控件. 在窗口的

                右键菜单中可以方便的添加/删除工具条,状态条,改变主窗口的默认信号连接操作.可以方便的使用

                动作编辑器(Actions Edit)编辑菜单或工具条的动作, 并且可以在多个窗口之间自制和粘贴Action. 

                可以用鼠标在菜单和工具条之间 拖动Action, Ctrl+左键 拖动可以在菜单和工具条上关联Action.

        Dock Widget: 你可以放置粘附控件到主窗口中,默认Dock Widget是不粘附的, 需要设置它的

                docked和dockWidgetArea属性.

        连接Widged信号到From: 在信号/槽编译模式中, 从Widged上拖动信号线到From背景上,这是会出

                现一个电源地的图标表示连接到From.

        伙伴编辑: 当一个label部件设置了快捷键, 当用户按下快捷键时, 输入焦点回跳到它对应的伙伴部件上.

                要设置Label部件的伙伴只需要在伙伴编辑模式用鼠标从Label上拖到要连接的部件上就行了. 

        使用资源:可以使用资源编辑器来创建资源文件, 设置别名,语言等. 在选择资源包含的文件时, 如果文件

                不在.qrc所在的目录或子目录下, 编辑器会提示是否复制到当前位置来. 

        自定义部件: Qt Designer可以使用插件机制来显示自定义部件. 可以将自定义部件集成到Qt Designer

                中, 有两种方法可以进行集成:

            提升控件(Promote to..):  在Qt Designer中设计窗口时,可以使用控件占位符来代替自定义控件.

                    将一个和自定义控制最接近的控件,通常为自定义控件所继承的QT标准控件, 如果没有合适的可

                    以使用QWidget做通用替代. 然后在占位控件的右键菜单上选择"Promote to"提升为自定义控

                    件. 在弹出的窗口中设置自定义控件的类名和要包含的头文件就行了. 提升法的却点是不能在

                    QT Designer中设置控件特有的属性和绘制自己.

            插件法: 要在Qt Designer中使用控件插件, 需要一个继承自QDesignerCustomWidgetInterface

                    的类并实现相应的方法的控件构造器. 然后将控件和构造器创建为动态库. 插件编辑好后放到

                    Qt Designer的插件目录就能在Designer中使用了. 也可以使

                    用QDesignerCustomWidgetCollectionInterface一次性创建多个控件的信息.这里面要注意

              的是domXml()函数, 这个函数需要返回一个.ui文件的片段来告诉QT Desiger创建自定义控件

              的一些信息;

              插件需求: 要使插件能在所有的平台下都能工作, 插件需要导出一些Qt Designer需要的符号,

                        首先就使用Q_EXPORT_PLUGIN2()宏声明插件的名字和类, 然后每一个插件类都要在声明

                        中使用QDESIGNER_WIDGET_EXPORT宏

 

创建自定义控件插件

        要使自己的控件向QT原生控件样能在Qt Designer中使用, 需要做如下的工作:

#include <QtDesigner/QDesignerExportWidget>                          //包含头文件

class QDESIGNER_WIDGET_EXPORT MyWidget : public QWidget     //声明自己的控件类控制的实现

{...}                                                                                  //根普通的一样

 

        在定义一个插件类来包装我们的控件:

//文件文件MyWdigetPlugin.h

#include <QDesignerCustomWidgetInterface>

class MyWidgetPlugin: public QObject ,public  QDesignerCustomWidgetInterface

{

     Q_OBJECT

     Q_INTERFACES(QDesignerCustomWidgetInterface)             //声明这是一个插件的实现

...

}

 

//然后在MyWidgetPlugin.cpp中实现QDesignerCustomWidgetInterface中的接口函数就行了

        注: 要使Qt Designer能加载插件, 必须以release编译, 然后将库复制到QT安装目录的plugins/designer下;

            不知为何, 控件用ui文件自动创建的,不能在Designer中显示出自定义控件的内容, 而在paintEvent事件中使用QPainter直接绘制的,或在构造函数中动态创建的则都能显示. 原因已找到,是因为没有调用setupUi().

 

 

在程序中使用组件

        编译时处理: 要在编译使用组件有以下几种方法:

                ● 直接使用:在创建部件时, 在部件中使用占位符, 使用占位符时有可能部件对应的头文件还没有生成:

#include "ui_calculatorform.h"

 

QApplication  app(argc, argv) ;

QWidget *widget = new QWidget;

Ui::CalculatorForm ui;

ui.setupUi(widget);

widget->show(); ui_calculatorform.h头文件为uic工具通过.ui文件生成的.

  在这里使用Ui::CalculatorForm是一个接口描述对象,

 

                ● 单继承: 这种方法是定义一个类继承自QWidget(或自定义组件的父类),通常的命名规则是去掉uic生成的类名去掉Ui::前缀, 然后在该类中定义一个界面组件的Ui类的成员变量(如: Ui::CalculatorForm ui), 并在构造函数中调用ui.setupUi(this)函数初始化对话框. 这种方法的好处是对外封装了Form.

 

                ● 多继承: 这种方法是使我们定义的类同时继承QWidget和UI界面类,同样需要在类的构造函数中调用setupUi(this)来初始化. 这种方法的好处是其它类直接方法Form中的信号和槽, 并且以不用在使用ui前缀来访问Form中的成员了.

 

        运行时处理:动态对话框是不用时先使用价值uic工具把.ui文件变成C++代码, 而是在程序运行时用

                QUiLoader动态加载.ui文件, 然后使用QObject::findChild<T>()族函数得到对话框中的了控件.

 

#include <QtUiTools>

 

QUiLoader uiLoader;

QFile file("sortdialog.ui");

QWidget *sortDialog = uiLoader.load(&file);

if( sortDialog )

{ ... }

 

QComboBox *primaryColumnCombo = 

                       sortDialog->findChild<QComboBox *>("primaryColumnCombo");

if (primaryColumnCombo) {

      ... 

}

                QUiLoader类在一个单独的链接库中,如果在一个应用程序中使用了QUiLoader,必须在这个程

            序的.pro文件中添加下面这样的代码:

                        CONFIG         += uitools

 

        自动连接:

                 在编译或运行时,元对象模型根据规则创建一些适合的连接.我们只需要定义槽的名字为下面这样的格式:

 

void on_<widget name>_<signal name>(<signal parameters>);

            这样uic就会生成QMetaObject::connectSlotsByName(this); 这段代码来使用QMetaObject的自动连接功能. 这种标准的命名和连接方法正是Qt Designer的工作基础.

 

 

QT Event:

    安装事件过滤:

    MyObject.installEventFilter( this );

    事件处理函数:

        bool MyObject::eventFilter(QObject *obj, QEvent *event){

                if( obj == MyObject 

                    && event->type() == QEvent::MouseButtonDblClick )

                {

                       //处理鼠标双击事件

                        return true;

                }

                 return QWidget::eventFilter(obj, event);

        }

 

 

 

 

QT样式系统(Style)

            Qt的样式是内置的用于控制绘制集成方案. Qt 4的样式系统不需要控件自身为此提供功能支持. 这个系统使得在绘图时不用关心具体的控件类型. 

        定制样式:

            这一特性由QStyle实现, QStyle是一个抽象基类, 它封装了GUI的观感系统. 

            大多数的绘制功能都需要下面的4个参数:

                 ● 枚举值指定一个特定的绘制元素

                 ● 一个QStyleOption指定在哪里和怎样呈现

                 ● 一个QPainter将要使用它来进行绘制

                 ● 一个可选的QWidget,为要绘制的控制.

             QStyleOption使用不同的子类来绘制不同的图形元素,我们以可以继承它来实现自己的元素样式绘制。 

             前QT4支持八种不同的窗口样式。我们以可以扩展自己的窗口样式。如果只要想个别的改变某个控件的样式, 可以在控件的paintEvent事件中重新设置控件的绘制样式; 以可以通过继承现有的窗口样式来定义自己的整体窗口样式.

 

        样式表(Style sheet): 从QT4.5开始, QT的样式表已经支持Mac OS X, 但是不支持自定义的QStyle的子类. QT的样式表使用CSS的方法来自定义控件的外观. 我们可以使用QApplication::setSytleSheet()或QWidget::setSytleSheet()来设置整个程序或单个控件使用的样式表;

 

        使用样式: 可以在运行程序时使用命令行参数 -sytle <样式名> 来指定用什么样式来运行程序。在程序运行时可以使用QApplication::setStyle()和QWidget::setStyle()来设置要使用的样式。

 

 

Model/View结构

             Qt 4引入了一些新的Model/View架构的类, 它提供一种标准的模型接口使得它可以使用不同的数据源来获取数据. 它使得可以使同一个数据能有不同显示视图或不同的用户输入界面.

            这个模型由"View", "Model","delegate"三部分组成, "Data"数据源通过一个接口与其它组件通信, 这个通信是类型相关的, 类型相关的通信由"Model"来完成. "view"通过"Model"获得一个索引表, 通过这个索引表, "View"能向"Model"检索具体的数据.在视图中, 使用"Delegate"来操作数据, 它通过索引与"Model"直接通信.

            Models:所有的Model都继承自QAbstractItemModel,这个类定义了给"View"和"Delegate"访问数据的接口. Model中并不保存实际数据, 而是由其它组件提供. 可以通过继承相应的Model类来定义自己的Model.

                    不管底层的具体数据是什么样的,Models都将它们描述为具有层次结构的表中, View使用这种层次索引预定来访问数据,数据改变时model还能通知相关的View. Models通过信息和槽来通知附加到他上面的View数据的改变. 每一个数据项通过行,列号及父节点来定位(model.index( row, col, parent)).

                    Item Roles:可以为Dodel中的不同的项施加一个规则,这个规则告诉Model我们想要什么样的数据.

            Views:实际各种不同的显示任务,如将数据显示为列表,表格, 树等. 这些类都继承自QAbstractItemView类, 以可以继承它来实现自己的View类.

            Delegates: 由委托提供数据显示和编辑, 这样可以获得更佳的伸缩性.QAbstractItemDelegate类定义了这个框架中的delegate的接口.Delegates根据指定的Role来返回需要呈现的数据.Qt提供了一个默认的QItemDelegate类.在Delegate中使用paint()及sizeHint()来显示数据, 当要编辑数据时Delegate提供一个编辑控制, 默认的呈现规则由Qt::ItemDataRole类型定义.

            排序: 如果你的model能支持排序, 如实现了sort(), 那么View可以通过接口来使数据排序. 如果你的Model没有实现排序, 你以可以使用一个代理Model来在实际Model和View之间转换数据.

 

Qt Script

            Qt Script是基于ECMAScript的脚本语言, QT使用元对象模型技术来使脚本能动态的访问C++类和对象. 它使用自动垃圾回收来管理脚本中的对象. 脚本引擎使用三中所有权模式来管理C++的QObject对象:

                 ● QT所有: 对象的生存期由QT运行时控制, 遵循QT对象树模型

                 ● 脚本所有: 生存期由脚本引擎控制

                 ● 自动所有者: 根据这个QObject是否有父对象来自动决定由谁控制该对象的生存期.

                 所以,在程序中我们应该小心控制对象的所有权, 否则有可能引起C++或脚本中出现出错的对象引用(在C++中释放了,脚本不知道,或返之).

            创建脚本对象: 任意的继承自QObject的对象都可以通过QScriptEngine::newObjct()创建给脚本使用, 或者说没有继承或??间接继承??自QObject的对象是不能创建到脚本引擎中的,脚本引擎使用内省机制来获得对象的信息. 在创建脚本对象时,可以控制脚本针对对象的访问能力(子对象,属性等).

            创建脚本可用的C++类: 默认的元对象系统只使信号和槽对脚本可用. 如果要使一个其它的成员函数对脚本可用,需要在类的函数声明前加上"Q_INVOKABLE"宏.这样在脚本中就可以如同槽一样的调用或连接该函数了.如果想让脚本访问对象的属性,必须在类中使用"Q_PROPERTY"宏来指定属性的读写对应的函数; 在脚本里需要使用到的枚举类型以要使用"Q_ENUMS( 类型 )"声明一下.

                class MyClass : public Object

{

    Q_OBJECT

    Q_PROPERTY( Type type READ type WTITE setType )

    Q_ENUMS( Type )

public:

    Q_INVOKABLE void setType( Type type );

}

            脚本中的国际化: 在脚本中可以使用qsTr()函数一包装需要国际化的文本, 如果在程序中使用的动态加载的翻译文件(QCoreAcclication::installTranslator()函数), 那么必须调用QScriptEngine::installTranslatorFunctions()函数来将翻译文件同步到脚本引擎.

 

        可以使用qScriptConnect函数来连接一个信号到JS中的函数上. 而在JS中可以使用函数对像的connet()函数来连接一个函数槽上:

        myObject.somethingFunction.connect( myOtherQObject.doSomething );

        在JS中就能调用C++对象了.

        在C++中调用JS的函数:

            //使用对象名(函数, 全局对象)来取得对应的js对象

             QScriptValue = JavascriptEngine.evaluate( "对象名" );

            //使用QSctiptValue的call函数来调用JS对象

            QSctiptValue.call( thisObj, 参数 );

 

       在连接C++的信号到js的函数时,Js函数不能定义为有参数的, 只能定义为无参函数(如:function AFunc()), 在函数中可以使用 arguments数组来到得传入的参数. 参数的类型可以使用:

if( typeof arguments[0] != "number" ){}这样的方式来判断.

 

控件尺寸策略

        sizePolicy属性指定了控件的缩放策略:

            Fixed: 控件不能改变大小,它的大小由sizeHint决定

            Minimum: 控件的最小尺寸为sizeHint,能大于这个值

            Maximum: 控件的最大尺寸为sizeHint.

            Preferred: 可以放大或缩小.

            Expandint: 控件可以自行增大或缩小.当于Preferred的控件一起时,Expandint的控件放大优先级高.

        还可以使用sizePolicy的stretch来指定控件的相对缩放倍数,如两个控件的stretch一个为2,一个为1,缩放是时,=2的缩放是=1的两倍;

 

 

qmake

 

qmake命令记录:

 

TEMPLATE += app , lib , subdirs     #当使用subdirs模板时, 使用SUBDIRS变量指定要编译的子目录,在

                                               #每个子目录中必须有自己的.pro文件.qmake会为每个目录生成一个

                                               #自己的Makefile文件, 这样就可以一次编译整个目录了

TARGET +=

CONFIG += qt debug  release warn_on  plugin              #使用的Qt库和基本编译选项

CONFIG += ordered  thread                    #ordered指定子目录按加入的顺序处理

                                                #每一个CONFIG变量的标记都可以使用CONFIG()函数来检查

CONFIG( debug, debug|release ) {       #分别为debug和release版指定不同的名字

     TARGET = debug_binary_name 

} else {

     TARGET = release_binary_name

}

 

CONFIG -= qt                               #编译不使用QT的程序

 

QT       =   $$CONFIG  network xml      #指定要连接的其他Qt库,  使用$$开头来引用其它变量

 

DEFINES  +=                             #预定义符号或宏列表

 

INCLUDEPATH  +=                       #头文件搜索路径

DEPENDPATH   +=                       #库搜索路径?

 

LIBS       +=  -L  -l     #要连接的库路径和库, 用法和标准Makefile一样

 

HEADERS +=

SOURCES +=

 

RESOURCES += 

FORMS    += .ui

win32 {

     debug{

           CONFIG +=  console        #在Windows下,调试时打开一个终端,可以使用qDebug()输出

     }

unix {

      SOURCES += hellounix.cpp

}

 

 

DESTDIR  += 指定依赖的目录,会自动在这些目录中去查找文件并加上路径 

 

 

!exists( filename ){   ...  }

 

 

include( other.pro )                   #引用其它文件

 

DESTDIR   =  $$(PWD)               #编译好的可执行程序存放位置, 使用$$()来引用环境变量

DESTDIR   + "Program Files"        #当指定的值中有空格时,使用引号括起来

 

 

高级语法 -----------

    $$开头  引用其它变量

    $$()  引用环境变量

    $$[]  引用Qt编译配置项

    system(command)  执行一个系统命令

    在使用{}括号时, 左括号必须和命令在同一行,不能像c那样在单独的一行中

编译目录特性------------

    qmake可以生成各种类型的程序需要的Makefile文件, 即使是不使用QT的其它程序项目, 可以在.pro文件中使用特定的CONFIG属性来配置,如: CONFIG += console exceptions 生成windows下的命令行程序,并允许异常; 这些特性可以在$(QTDIR)/mkspecs/features下找到, 相关特性可以组合使用.

    使用配置 CONFIG -= qt   , QT -= core 可以生成不使用QT的项目

 

更改QT的安装路径--------------

变更Qt原安装路径后必须注意的事项(不需要重新编译了):

1.设置QMAKEPATH=Qt现在路径

      QTDIR=Qt现在路径

2.将QMAKESPEC下的qmake.conf作如下改动:

  a.修改:

    QMAKE_INCDIR_QT    = $$(QTDIR)/include

    QMAKE_LIBDIR_QT    = $$(QTDIR)/lib

    QMAKE_MOC              = $$(QTDIR)/bin/moc.exe

    QMAKE_UIC                = $$(QTDIR)/bin/uic.exe

    QMAKE_IDC                = $$(QTDIR)/bin/idc.exe

  b.增加:

    QMAKE_RCC              = $$(QTDIR)/bin/rcc.exe

 

以可以写到Qt的项目文件.pro中

QMAKE_INCDIR_QT    = $$(QTDIR)/include

QMAKE_LIBDIR_QT    = $$(QTDIR)/lib

QMAKE_MOC          = $$replace(QMAKE_MOC, $$dirname(QMAKE_MOC), $$(QTDIR)/bin/) 

QMAKE_UIC          = $$replace(QMAKE_UIC, $$dirname(QMAKE_UIC), $$(QTDIR)/bin/) 

QMAKE_IDC          = $$replace(QMAKE_IDC, $$dirname(QMAKE_IDC), $$(QTDIR)/bin/) 

QMAKE_RCC          = $$replace(QMAKE_RCC, $$dirname(QMAKE_RCC), $$(QTDIR)/bin/) 

 

 

??replace在windows下有点不好使

设置两个环境变量:

    QTDIR= QT

    QMAKESPEC=$QTDIR/mkspecs/default      #编译QT时使用的编译器默认配置

 

 

注: 使用qt.conf文件是一下更好的选择

将qt.conf文件放到程序所在的目录或qmake的目录,内容如下:

[Paths]

Prefix = D:/qt/4.5.0

 

 

Mac OS X 相关 ---------------

QMAKE_LFLAGS  += -F/path      #在Mac下会自动到/Library/Frameworks下去查找库, 如果有其它位

                                            #置, 使用这个变量指定

LIBS    +=  -framework TheFramework #指定要连接的一个Framework的名字

 

qmake -spec macx-xcode project.pro  #产生一个Xcode的项目文件

qmake -tp vc                                  #生成vs的工程文件

 

 

 

INSTALLS

         documentation.path =  安装目标路径目录

         documentation.files  =  要安装的文件可以用通配符

         documentation.extra = 自定义要执行的一系列命令,可用分号分隔多个命令

 

         INSTALLS += documentation  加到安装指令中

         INSTALLS += target    一个预定义的安装节

 

        可以用分节命令指定是什么平台的,如: unix:documentation.files

 

 

 

 

QWebKit

       一个页面由下列三层结构构成: QWebView -> QWebPage ->QWebFrame(一个QWebPage可以包含多个QWebFrame),  QWebView主要负责浏览器框架的管理,一个QWebView就类似于浏览器中的一个Tab页, QWebView继承于QWidget,当需要进行标准QT界面的事件或属性时, 直接处理或从QWebView派生, 要创建上下文菜单或响应鼠标等对页面内容的操作时, 分别在派生类的contextMenuEvent, mousePressEvent, mouseReleaseEvent等事件中处理, 在事件中, 使用QWebFrame.hitTestContent()函数,可以知道当前鼠标指向的内容. 如果不需要使用QWidget的特性, 可以直接使用QWebPage.

    每一个QWebFrame包含一个独立的Html文档, 在html中可以使用标准的JS, 并使用JS和C++中定义的QObject的子类进行互操作, 使用QWebFrame.addToJavaScriptWindowObject()函数向JS环境中添加一个QObject的实例对象, 并指定一个对象名, 在JS中就可以使用这个对象名来访问QObject实例的属性,槽和信号.

    QWebHitTestResult: 这个类是QWebFrame.hitTestContent()函数的返回结果, 标识调用该函数是续写的点对就的html文档的内容.

你可能感兴趣的:(object,脚本,qt,工具,makefile,transformation)