如何在java中的控件上显示图片.

 最主要是应用到javax.swing包下面的ImageIcon类;方法如下:

import javax.swing.ImageIcon;

ImageIcon image = new ImageIcon("图片的路径");

jButton1.add(image);

浏览便搞定了。

在Qt,可以使用QtAndroidExtras模块的QAndroidJniObject类来访问Android原生API,实现在Android设备上选择图片并在Qt应用显示的功能。 以下是实现这一功能的步骤: 1. 在.pro文件添加QtAndroidExtras模块: ``` QT += androidextras ``` 2. 在Qt应用创建一个QLabel控件,并为其添加一个槽函数用于接收从Android设备上选择的图片: ```cpp // 在头文件声明一个QLabel控件和一个槽函数 private: QLabel *m_imageLabel; private slots: void onImageSelected(const QString& imagePath); ``` ```cpp // 在构造函数创建QLabel控件并连接槽函数 MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { m_imageLabel = new QLabel(this); connect(this, SIGNAL(imageSelected(QString)), this, SLOT(onImageSelected(QString))); } ``` 3. 在槽函数将选择的图片显示在QLabel控件: ```cpp void MyWidget::onImageSelected(const QString& imagePath) { // 加载图片 QPixmap pixmap(imagePath); // 在QLabel控件显示图片 m_imageLabel->setPixmap(pixmap); } ``` 4. 在Qt应用调用Android原生API,打开图片选择器: ```cpp void MyWidget::selectImage() { // 创建一个QAndroidJniObject对象,用于访问Android原生API QAndroidJniObject ACTION_PICK = QAndroidJniObject::fromString("android.intent.action.PICK"); QAndroidJniObject intent("android/content/Intent", "()V"); // 设置Intent的类型 intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString("image/*").object()); // 调用startActivityForResult方法打开图片选择器 QtAndroid::startActivityForResult(intent, 101, ACTION_PICK.object<jstring>()); } void MyWidget::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data) { // 判断是否是从图片选择器返回的结果 if (receiverRequestCode == 101 && resultCode == -1 && data.isValid()) { // 获取选择的图片的路径 QAndroidJniObject uri = data.callObjectMethod("getData", "()Landroid/net/Uri;"); QAndroidJniObject contentResolver = QtAndroid::androidActivity().callObjectMethod("getContentResolver","()Landroid/content/ContentResolver;"); QAndroidJniObject fileDescriptor = contentResolver.callObjectMethod("openFileDescriptor", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;", uri.object(), QAndroidJniObject::fromString("r").object()); QAndroidJniEnvironment env; jint fd = env->GetJavaVM(env, nullptr)->AttachCurrentThread(&env, nullptr, nullptr); // 使用QtAndroid::androidContext()获取Context对象 jobject context = QtAndroid::androidContext().object(); jclass contentResolverClass = env->GetObjectClass(contentResolver.object()); jclass fileDescriptorClass = env->GetObjectClass(fileDescriptor.object()); jmethodID createInputStreamMethod = env->GetMethodID(contentResolverClass, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;"); jmethodID createFileDescriptorMethod = env->GetMethodID(fileDescriptorClass, "getFileDescriptor", "()Ljava/io/FileDescriptor;"); jobject inputStream = env->CallObjectMethod(contentResolver.object(), createInputStreamMethod, uri.object()); jobject fileDescriptorObject = env->CallObjectMethod(fileDescriptor.object(), createFileDescriptorMethod); jint fileDescriptorInt = env->GetObjectField(fileDescriptorObject, env->GetFieldID(env->GetObjectClass(fileDescriptorObject), "descriptor", "I")); // 将Java的InputStream对象转换为C++的QByteArray对象 QAndroidJniObject jba = QAndroidJniObject::callStaticObjectMethod<jbyteArray>("org/qtproject/example/QtAndroidUtils", "readStream", "(Ljava/io/InputStream;)V", inputStream); jbyte *bytes = env->GetByteArrayElements(jba.object<jbyteArray>(), NULL); jsize length = env->GetArrayLength(jba.object<jbyteArray>()); QByteArray byteArray((char*)bytes, length); env->ReleaseByteArrayElements(jba.object<jbyteArray>(), bytes, 0); // 将QByteArray对象转换为图片文件 QString imagePath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + "/" + QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz") + ".jpg"; QFile file(imagePath); if (file.open(QIODevice::WriteOnly)) { file.write(byteArray); file.close(); // 发送图片路径信号 emit imageSelected(imagePath); } } } ``` 在handleActivityResult方法,首先判断返回的结果是否是从图片选择器返回的,然后获取选择的图片的路径,将Java的InputStream对象转换为C++的QByteArray对象,最后将QByteArray对象转换为图片文件,并将图片路径发送到槽函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值