Qt for iOS,Qt 与Objective C混合编程

因为我写了一系列Qt的博文以及一本书《Qt on Android核心编程》,最近有好几个使用Qt的朋友问起 Qt for iOS 的事情,因为我在这方面的经验特别少,写不出系统的文章来,非常抱歉,不能给出令人满意的答复,推荐大家去看Jason’s Home,在我博客左侧边栏的友情链接里也有,他提供了 Qt for iOS 的一些非常有意义的文章,而且是基于实践的,他的 App 已经在 App Store 中上线。

至于我呢,在这篇文章里,简单介绍一些如何混合 Qt 与 OC 编程。

我要说的内容呢,大部分在 Qt 帮助里都有,请大家到索引模式下,键入”Qt for iOS”,找到 Qt for iOS 这篇文章来看。它介绍了搭建开发环境、编译应用、混合OC编程这三个方面,已经非常详细了。

如果你不想啃英文,那可以接着我的文章往下看。

项目设置

既然要聊 Qt 混合 OC 编程,首先要简单介绍一下 Objective C 。我只有一句话:Go,问搜索引擎去。因为我所知实在有限,怕误导了您。当然如果您不怕,往下看吧。

OC源文件介绍

首先我要说一下 Objective C 的源文件,后缀是.m 或 .mm ,在 .mm 文件里,可以直接使用 C++ 代码。所以,我们要混合 Qt 代码与 OC 代码,就需要在 Qt 项目里加入 mm 文件。

pro 文件配置

Qt SDK for Mac ,安装之后, Qt Creator 会使用 XCode 提供的编译工具链来编译代码,能够正确编译 mm 文件,也可以链接 iOS 的库文件。

而要混合 OC 代码,需要更改一下 pro 文件。一个是添加 mm 文件,一个是连接针对 iOS 的库文件。

添加源文件,使用 OBJECTIVE_SOURCES 这个变量,比如酱紫:

<code class="hljs fix has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-attribute" style="box-sizing: border-box;">OBJECTIVE_SOURCES +</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"> ocview.mm</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

链接库 XCode 提供的库,则需要使用 QMAKE_LFLAGS ,类似酱紫:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">ios {QMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> OpenGLESQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> GLKitQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> QuartzCoreQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> CoreVideoQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> CoreAudioQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> CoreImageQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> CoreMediaQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> AVFoundationQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> AudioToolboxQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> CoreGraphicsQMAKE_LFLAGS <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-attribute" style="box-sizing: border-box;">-framework</span> UIKit}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

上面是我使用 Qt 针对 iOS 编程的配置。我使用了很多针对 iOS 的库,所以添加了很多 framework 。

“ -framework UIKit ”这种参数,是经由 Makefile 传递给 Clang 的参数,-framework 是用来指示要链接某个框架(或者说库)的关键字,它后面跟的是框架(库)名。

需要注意的是,我们使用针对 iOS 的库,不是通过“ LIBS += ”这种方式来引入哦。当然,你自己通过 Qt 实现的 .a 库,依然需要使用“ LIBS += ”这种方式。

指定plist文件想要成功,就一定要和成功的人在一起,不然反之

Qt for iOS,Qt 与Objective C混合编程

相关文章:

你感兴趣的文章:

标签云: