zoukankan      html  css  js  c++  java
  • 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-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

  • 相关阅读:
    第六章 (循环结构二)
    MySQL改密码
    第八章
    第二章 变量 数据类型和运算符
    [Windows Phone 7璀璨]北漂1.0在线歌词播放器一.项目搭建及版权声明
    [Windows Phone 7璀璨]北漂1.0在线歌词播放器二.歌曲按艺术家分类实现
    [这不是Windows Phone 7]FitnessTrackerPlus(健身)一.数据库介绍
    [学习笔记]Silverlight4 RIA 开发全程解析[项目全程记录]第二章为站点流行而准备:提供一个可扩展的体系结构(写作中)
    [这不是Windows Phone 7]FitnessTrackerPlus(健身)二.架构搭建
    ERP成本核算
  • 原文地址:https://www.cnblogs.com/findumars/p/6690079.html
Copyright © 2011-2022 走看看