一直做的是windows开发,有2个小项目想做到手机。
看来看去,选择了QT。
本文介绍自己的学习的一些心得,希望对你有帮助。
1.选择QT2.安卓的一些事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++的书,想提高性能的话,还是得看深入介绍的书籍才行。
当然,仅仅是会用,当然是不用看,像我这种半路出家的,呵呵。