2013-02-26 19 views
5

Qt uygulamalarını Qt/Necessitas (Android) uygulamasına yönlendirmenin güzel bir yolunu arıyorum.Qt/Necessitas - makul QFileDialog değiştirme/cilt?

QtGUI widget'lerinden bazıları kesinlikle ne yazık ki, QFileDialog dahil olmak üzere.

Uygun bir görünüm ve his ile herhangi bir değişiklikten haberiniz var mı? QFileDialog, Necessitas geliştiricileri için yüksek öncelikli yerlerde kullanılabilir hale getiriyor mu?

#include <QApplication> 

#include <QFileDialog> 

int main(int argc, char* argv[]) { 
    QApplication a(argc, argv); 

    QString fileName = QFileDialog::getOpenFileName(NULL, 
     QObject::tr("Open Image"), "/home/jana", QObject::tr("Image Files (*.png *.jpg *.bmp)")); 

    a.exec(); 
} 

QFileDialog

+0

Ne demek istiyorsun - atrocious ?? Bu kesinlikle kaygan! – mlvljr

cevap

1

Kolayca out-of-the-box QFileSystemModel sınıfını kullanarak ya QtWidgets veya QML ile kendi dosya iletişim, inşa edebileceğini. Öncelikli olsun ya da olmasın, Necessitas'ın Digia'nın Android'i destekleme çabaları tarafından emileceği anlaşılıyor. Modül DONE olarak işaretlendiğinden ve UI için tüm odak QML üzerinde olduğundan, QtWidgets'ı uygun şekilde biçimlendirmek için önemli çabalar olacağından kuşku duyuyorum. Yani, senin yerinde olsaydım nefes alamazdım. Ayrıca stok Qt widget'ları masaüstü olmayan platformlarda tamamen çirkin görünüyor.

3

Android'de kendi yerel dosya iletişim kuralı bulunmamaktadır. Ben sarıcı yazdı

chosing external application

, bunun için kullanılabilir: Bir dosyayı alabilir olduğunda harici bir uygulama başlatmak için QtAndroidExtras kullanabilirsiniz.

androidfiledialog.h

#ifndef ANDROIDFILEDIALOG_H 
#define ANDROIDFILEDIALOG_H 

#include <QObject> 
#include <QAndroidJniObject> 
#include <QtAndroid> 
#include <QAndroidActivityResultReceiver> 

class AndroidFileDialog : public QObject 
{ 
    Q_OBJECT 

public: 
    explicit AndroidFileDialog(QObject *parent = 0); 
    virtual ~AndroidFileDialog(); 
    bool provideExistingFileName(); 

private: 
    class ResultReceiver : public QAndroidActivityResultReceiver { 
     AndroidFileDialog *_dialog; 
    public: 
     ResultReceiver(AndroidFileDialog *dialog); 
     virtual ~ResultReceiver(); 
     void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data); 
     QString uriToPath(QAndroidJniObject uri); 
    }; 

    static const int EXISTING_FILE_NAME_REQUEST = 1; 
    ResultReceiver *receiver; 
    void emitExistingFileNameReady(QString result); 

signals: 
    void existingFileNameReady(QString result); 
}; 

#endif // ANDROIDFILEDIALOG_H 

androidfiledialog.cpp

#include "androidfiledialog.h" 

AndroidFileDialog::ResultReceiver::ResultReceiver(AndroidFileDialog *dialog) : _dialog(dialog) {} 
AndroidFileDialog::ResultReceiver::~ResultReceiver() {} 

void AndroidFileDialog::ResultReceiver::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data) 
{ 
    jint RESULT_OK = QAndroidJniObject::getStaticField<jint>("android/app/Activity", "RESULT_OK"); 
    if (receiverRequestCode == EXISTING_FILE_NAME_REQUEST && resultCode == RESULT_OK) { 
     QAndroidJniObject uri = data.callObjectMethod("getData", "()Landroid/net/Uri;"); 
     QString path = uriToPath(uri); 
     _dialog->emitExistingFileNameReady(path); 
    } else { 
     _dialog->emitExistingFileNameReady(QString()); 
    } 
} 

QString AndroidFileDialog::ResultReceiver::uriToPath(QAndroidJniObject uri) 
{ 
    if (uri.toString().startsWith("file:", Qt::CaseInsensitive)) { 
     return uri.callObjectMethod("getPath", "()Ljava/lang/String;").toString(); 
    } else { 
     QAndroidJniObject contentResolver = QtAndroid::androidActivity().callObjectMethod("getContentResolver", "()Landroid/content/ContentResolver;"); 
     QAndroidJniObject cursor = contentResolver.callObjectMethod("query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;", uri.object<jobject>(), 0, 0, 0, 0); 
     QAndroidJniObject DATA = QAndroidJniObject::fromString("_data"); 
     jint columnIndex = cursor.callMethod<jint>("getColumnIndexOrThrow", "(Ljava/lang/String;)I", DATA.object<jstring>()); 
     cursor.callMethod<jboolean>("moveToFirst", "()Z"); 
     QAndroidJniObject result = cursor.callObjectMethod("getString", "(I)Ljava/lang/String;", columnIndex); 
     return result.isValid() ? result.toString() : QString(); 
    } 
} 

AndroidFileDialog::AndroidFileDialog(QObject *parent) : QObject(parent) 
{ 
    receiver = new ResultReceiver(this); 
} 

AndroidFileDialog::~AndroidFileDialog() 
{ 
    delete receiver; 
} 

bool AndroidFileDialog::provideExistingFileName() 
{ 
    QAndroidJniObject ACTION_GET_CONTENT = QAndroidJniObject::fromString("android.intent.action.GET_CONTENT"); 
    QAndroidJniObject intent("android/content/Intent"); 
    if (ACTION_GET_CONTENT.isValid() && intent.isValid()) { 
     intent.callObjectMethod("setAction", "(Ljava/lang/String;)Landroid/content/Intent;", ACTION_GET_CONTENT.object<jstring>()); 
     intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString("file/*").object<jstring>()); 
     QtAndroid::startActivity(intent.object<jobject>(), EXISTING_FILE_NAME_REQUEST, receiver); 
     return true; 
    } else { 
     return false; 
    } 
} 

void AndroidFileDialog::emitExistingFileNameReady(QString result) 
{ 
    emit existingFileNameReady(result); 
} 
Sen * .pro dosyaya eklemek zorunda

: İşte tam kod örneği kullanarak

QT += androidextras 

:

AndroidFileDialog *fileDialog = new AndroidFileDialog(); 
connect(fileDialog, SIGNAL(existingFileNameReady(QString)), this, SLOT(openFileNameReady(QString))); 
bool success = fileDialog->provideExistingFileName(); 
if (!success) { 
    qDebug() << "Problem with JNI or sth like that..."; 
    disconnect(fileDialog, SIGNAL(existingFileNameReady(QString)), this, SLOT(openFileNameReady(QString))); 
    //or just delete fileDialog instead of disconnect 
} 

yuvası uygulaması:

void MyClass::openFileNameReady(QString fileName) 
{ 
    if (!fileName.isNull()) { 
     qDebug() << "FileName: " << fileName; 
    } else { 
     qDebug() << "User did not choose file"; 
    } 
} 

bu çözüm cihazınızda düzgün çalıştığını teyit edin.

İlgili konular