Qt4升级到Qt5需要干的那些事(CMake)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt4升级到Qt5需要干的那些事(CMake)相关的知识,希望对你有一定的参考价值。
参考技术A 1.把CMakeList.txt里面的find_package(qt4 required)替换成了find_package(Qt5Widgets)如果你的Cmake报错:
CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindQt4.cmake:664 (message):
Could NOT find QtCore.
Check D:/chen/CMakeFiles/CMakeError.log for more details.
参考: Detecting Qt5 with CMake
2.删去INCLUDE($QT_USE_FILE)
将TARGET_LINK_LIBRARIES后面括号里面的$QT_LIBRARIES删去
将target_link_libraries simpleTree Qt5::Widgets加入到addLibrary后面(其中simpleTree是你要编译的项目名字,在CMakeList里面找一下,出现了很多次)
如果你的CMake报错:
CMake Error at CMakeLists.txt:36 (INCLUDE):
include called with wrong number of arguments. Include only takes one
file.
参考:
Cmake and QT5 - Include only takes one argument
Implementing Qt project through CMake
3.QT4_WRAP_CPP(HEADERS_MOC $INCLUDE_FILES)
QT4_WRAP_UI(FORMS_HEADERS $FORMS)
QT4_ADD_RESOURCES(RESOURCES_RCC $RESOURCES)
里面的4都改成5
如果你的CMake报错:
Unknown CMake command "QT4_WRAP_CPP".
4、把*.cmake文件里面的FIND_PACKAGE(Qt4 COMPONENTS QtCore QtXml QtOpenGL QtGui)替换成
FIND_PACKAGE(Qt5 QUIET COMPONENTS Core Xml OpenGL Gui Widgets)
这里还是报错findqt4有问题。
参考:
Autodetect and use Qt4 or Qt5
QT 那些事
一直做的是windows开发,有2个小项目想做到手机。
看来看去,选择了QT。 本文介绍自己的学习的一些心得,希望对你有帮助。 1.选择QT 2.安卓的一些事 3.QML调用C++ 4.资源集成(比较有用,网上资源比较少) 5.建议看看c++ //----------------------------------------------------------------------------------------------------------------------------------------------------------- 1.选择QT 编程玩了很多年,不太喜欢那种coding(直接用代码做界面),Linux基本上是我的禁区。。。 从编程的角度来讲,个人认为微软的C++类似这种编写界面的方式很不习惯。 从学习的角度,比较推荐Delphi,VB这些。 QT,下载后直接上手,看了几个DEMO,大概用三天时间把第一个项目做好了(非常简单的东西) 电脑,手机直接运行。 可能今后会有很长时间要在QT上玩了。 感觉,QT还有待优化;不同平台一套源代码,加之免费,确实很吸引人;但是不同平台界面确实相差太大。 //----------------------------------------------------------------------------------------------------------------------------------------------------------- 2.安卓的一些事:发布命名空间、图标、翻译、签名 要写的实在太多,简单写写 2.1如图中,三个操作点,重点第三个 window.open(\'http://www.qtcn.org/bbs/attachment/Mon_1409/50_154834_bd930e7f3891daa.png?52\');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" > 2.2AndroidManifest.xml文件的一些设置:包名,图标,权限 //----------------------------------------------------------------------------------------------------------------------------------------------------------- 3.QML调用C++:类必须用QObject、加入到QML中 加入到QML中,有两种方式: 1.直接用命令: engine.rootContext()->setContextProperty ("actService", new ActService); 其中:engine,系统默认会自动生成;new ActService,自己建立的类;actService可以在后面的QML直接引用。 PS:这么写系统还是会报错,需要手动加入#include <QtQml>才可以编辑。 2.注册新QML组件的方式: qmlRegisterType<ActService>("com.reeray.test.actservice",1,0,"ActService"); QML中,通过 import com.reeray.test.actservice 1.0 然后ActService就可以像其他的标准QML一样用了。非常COOL。 PS:这里,我建议采用第二种方式,便于编写一些扩展,以及同其他的组件交互。 ActService{ id:actService onNfStart:{ //---自定义命令调用,用于同其他组件互动。。。也算是一个回调 } } Button{ onClick:{ actService.notify("你好呀!")//调用c++,不管actService是用上述哪种方法,都可以哦 } } //----------------------------------------------------------------------------------------------------------------------------------------------------------- 4.资源集成:写本文的主要内容吧,网上的介绍实在太少 4.1 背景,此部分内容不一定正确,但是可行。***水平有限,勿喷!*** 前文,将按照定义com.reeray.test.act,项目名字为AssetsCopyTest 那么app自动装到手机 /data/bin/com.reeray.test.act-1/AssetsCopyTest.apk 该死的,居然有个-1 相应的软件空间为:/data/data/com.reeray.test.act/ 第一次运行,会将很多库文件,解压到下面 lib文件夹放置so文件。 另外一个最重要的,默认读写文件都在【/data/data/com.reeray.test.act/files/】 4.2 QRC方式。 如图中的DB文件,利用两个文件,一个读出,一个写入即可。 QFile file (":///nfviews/database/nf_data.db"); QFile file2 ("/data/data/com.reeray.test.act/files/nf_data.db"); if (!file.open (QIODevice::ReadOnly)) { qDebug() << "Open QRC file error!!!"; return; } if (!file2.open (QIODevice::WriteOnly)) { qDebug() << "Open write file error!!!"; return; } while (!file.atEnd()) { QByteArray line = file.readLine(); file2.write (line); } 对于程序所需要的文件少,这个方式比较方便。 但是也有明显的缺陷,就是app文件太大,编译慢不说,运行还占内存。 4.3 利用assets 这部分非常复杂,还有用到JAVA,悲剧吧。参考代码是系统自带的Notification实例。 一步步看吧! 4.3.1修改QtActivity 以下是NotificationClient定义Java类的一行代码 public class NotificationClient extends org.qtproject.qt5.android.bindings.QtActivity 以下是默认的AndroidManifest.xml文件内容 <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="@string /app_name" android:screenOrientation="unspecified" android:launchMode="singleTop"> 这部分很关键,不修改,没法编译的哦! 想调用自定义Java,必须将默认的QtActivy代替! com.reeray.test.act.NotificationClient 注意看红色的字体。 前文有图说明NotificationClient文件所在的路径,注意不能错。另外大小写。。。 复制assets的Java代码如下: public static void copyRes(String fn) { try { File dir = new File("/data/data/com.reeray.test.act/files"); if (!dir.exists()) dir.mkdir(); InputStream is = m_instance.getApplicationContext().getResources().getAssets().open("test.txt"); FileOutputStream fos = new FileOutputStream(new File("/data/data/com.reeray.test.act/files/" + fn)); byte[] buffer = new byte[7168]; int count = 0; while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } 调用Java代码: QAndroidJniObject ajo = QAndroidJniObject::fromString (m_notification); QAndroidJniObject::callStaticMethod<void>("com/reeray/test/act/NotificationClient", "copyRes", "(Ljava/lang/String;)V", ajo.object<jstring>()); PS:如果前面不修改AndroidManifest.xml,这几句是编译不过去的。 大概介绍精髓,详细代码看附件吧(貌似需要用7z打开) //----------------------------------------------------------------------------------------------------------------------------------------------------------- 5.建议看看c++ ;算是总结吧 自学的语言太多,大多在玩,对性能要求不高。 这几天看了下C++的书,想提高性能的话,还是得看深入介绍的书籍才行。 当然,仅仅是会用,当然是不用看,像我这种半路出家的,呵呵。 |
描述:4.3 复制assets的文件
附件: AssetsCopyTest.zip (16 K) 下载次数:13 |
http://www.qtcn.org/bbs/read-htm-tid-57370-fpage-4.html
以上是关于Qt4升级到Qt5需要干的那些事(CMake)的主要内容,如果未能解决你的问题,请参考以下文章