QFileDialog w Qt5 na Androidzie jest fatalny. Na szczęście znalazłem minimalistyczny fileselector:
http://www.scorchworks.com/Blog/simple-file-dialog-for-android-applications/
który świetnie się sprawdza w AspeQT:
Musiałem go tylko lekko zmodyfikować, bo na nazwę pliku oczekuję w pętli po stronie Qt (lame, ale brakło mi czasu na bardziej eleganckie rozwiązanie) i bez Cancel nie dało się z niej wyskoczyć:
QAndroidJniObject::callStaticMethod<void>("net/greblus/MyActivity", "runFileChooser", "()V"); QString fileName = NULL; do { QAndroidJniObject jFileName = QAndroidJniObject::getStaticObjectField<jstring>("net/greblus/MyActivity", "m_chosen"); fileName = jFileName.toString(); if (fileName == "Cancelled") {fileName.clear(); break;} if (fileName == "None") QThread::yieldCurrentThread(); } while (fileName == "None");
A w Javie, cały widz polega na tym, że MyActivity jest singletonem i niestatyczne metody (jak w FileChooser) trzeba wołać w wątku UI Androida z instancji singletona:
public class MyActivity extends QtActivity { ... public static MyActivity s_activity = null; ... public void onCreate(Bundle savedInstanceState) { s_activity = this; } ... }
public static void runFileChooser() { m_chosen = "None"; MyActivity.s_activity.runOnUiThread( new FileChooser() ); }
i wtedy można z C++ wywołać QAndroidJNIObject tak:
QAndroidJniObject::callStaticMethod<void>("net/greblus/MyActivity", "runFileChooser", "()V");
Lekko zmodyfikowany plik tutaj.