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)的主要内容,如果未能解决你的问题,请参考以下文章

QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法

TODO:软件升级的那些事

导航栏的那些事

配置文件那些事

离职后找工作那些事

使用 cmake 的跨平台 Qt5 项目