Qt编写Android App,调用Activity获得返回值

Qt编写Android App,调用Activity获得返回值,第1张

对于C++程序员来说使用Qt开发手机app不失为一个好的选择,当Qt不能满足要求时可以调用Android原生代码实现功能,由于Qt的帮助文档有限,相信不少Qt开发者也踩了不少坑

 

 

首先创建Qt工程

1.添加Android支持工程pro文件添加

QT += androidextras

2.编写Activity返回值类,派生于
QAndroidActivityResultReceiver,实现返回函数handleActivityResult,通过信号SendData将数据抛出去,代码如下:

ActivityResult .h 文件

#ifndef ACTIVITYRESULT_H

#define ACTIVITYRESULT_H

#include

class ActivityResult : public QObject,public QAndroidActivityResultReceiver

{

Q_OBJECT

signals:

void sendData(QString);

public:

int requestId;

ActivityResult(int id, QObject *parent = nullptr) : QObject(parent), requestId(id) {}

void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);

};

#endif // ACTIVITYRESULT_H

ActivityResult .cpp文件

#include

void ActivityResult::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data)

{

if(receiverRequestCode == requestId)

{

if(resultCode ==-1)

{

QAndroidJniObject name=QAndroidJniObject::fromString("select");

QAndroidJniObject str = data.callObjectMethod("getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;",name.object());

if(str==NULL)

{

emit sendData(tr("返回为空"));

return;

}

str.toString();

emit sendData(str.toString());

return;

}

else

{

//some code here

}

}

}

QT端调用代码

//调用Activity

void MainWindow::on_pushButton_clicked()

{

ActivityResult *m_ActivityResult;

QAndroidJniEnvironment env;

if(m_ActivityResult!=NULL)

{

delete m_ActivityResult;

}

m_ActivityResult = new ActivityResult(0);

connect(m_ActivityResult,SIGNAL(sendData(QString)),this,SLOT(sendData(QString)));//连接信号获得返回值

QtAndroid::runOnAndroidThread([=](){

QAndroidJniObject action =
QAndroidJniObject::fromString("org.qtproject.example.HelloWindow.XNActivity");//通用调用名称为org.qtproject.example.HelloWindow.XNActivity 保持和Java中要调用的Activity一致

QAndroidJniObject intent("android/content/Intent","(Ljava/lang/String;)V", action.object());

QtAndroid::startActivity(intent, 0, m_ActivityResult);

});

}

void MainWindow::sendData(QString str)

{

QMessageBox::information(NULL, tr("提示"), str,QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);//d窗显示返回的值

}

编译该工程将产生build-工程目录

用Android Studio打开该目录下的android-build

添加要调用的Activity

activity在AndroidManifest.xml中定义

org.qtproject.example.HelloWindow.XNActivity"/>

XNActivity布局代码

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ff0000ff"

>

android:layout_width="match_parent"

android:text="@string/click"

android:layout_height="wrap_content"

android:id="@+id/mybt"

/>

XNActivity.Java代码

package org.qtproject.example.HelloWindow;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import org.qtproject.qt5.android.bindings.QtActivity;

public class XNActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_xn);

findViewById(R.id.mybt).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent =new Intent(XNActivity.this, QtActivity.class);

intent.putExtra("select","123中华民族");//返回数据

setResult(Activity.RESULT_OK,intent);

finish();//结束当前Activity,返回上一个activity

}

});

}

}

现在再次编译工程运行,可以看到Activity返回串"123中华民族"

为避免Qt Java不不同数据类型转换的麻烦,可以采用传递json串方式解决

感谢你的支持下节将介绍使用Qt直接调用Java类

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存