• 5717阅读
  • 3回复

[原创]QT 那些事 [复制链接]

上一主题 下一主题
离线reerayxia
 

只看楼主 倒序阅读 楼主  发表于: 2014-09-05
— 本帖被 realfan 执行加亮操作(2014-09-05) —
一直做的是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) 下载次数:16
离线sumzhangwei

只看该作者 1楼 发表于: 2014-09-05
支持,我今天早上收到他的代码,很好用滴
本帖提到的人: @zzzzllll2006
在线toby520

只看该作者 2楼 发表于: 2014-09-05
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线weinkym

只看该作者 3楼 发表于: 2014-10-08
快速回复
限100 字节
 
上一个 下一个